如何通过后端利用web/signup URL在Odoo中创建门户用户
后端调用/web/signup创建门户用户并分配对应网站公司ID的实现方案
1. 构造带网站标识的注册请求
后端发起注册请求时,需在参数中明确传递用户注册的网站ID,让后续逻辑能关联到对应公司ID。以Python为例,用requests库构造POST请求:
import requests def create_portal_user(website_id, email, password, **kwargs): signup_url = "http://your-domain.com/web/signup" payload = { 'email': email, 'password': password, 'website_id': website_id, # 关键参数:传递网站标识 **kwargs } # 若框架有CSRF验证,测试环境可临时禁用,或获取CSRF token后加入请求头 headers = {'Content-Type': 'application/x-www-form-urlencoded'} response = requests.post(signup_url, data=payload, headers=headers) return response.json() if response.status_code == 200 else None
2. 在/web/signup视图中处理公司ID分配逻辑
修改注册视图,解析请求中的website_id参数,根据预设的网站-公司ID映射关系,为新用户分配对应公司ID:
# 示例Django视图逻辑 from django.http import JsonResponse from .models import PortalUser, Company def signup_view(request): if request.method == 'POST': website_id = request.POST.get('website_id') email = request.POST.get('email') password = request.POST.get('password') # 网站与公司ID的映射配置 website_company_map = { '1': 'company_001', '2': 'company_002', # 补充其他网站的映射关系 } company_id = website_company_map.get(website_id) if not company_id: return JsonResponse({'error': '无效的网站标识'}, status=400) # 创建用户并绑定公司ID user = PortalUser.objects.create_user( email=email, password=password, company_id=company_id ) return JsonResponse({'user_id': user.id, 'company_id': company_id})
3. 编写测试用例验证分配逻辑
针对不同网站的注册场景编写测试,确保公司ID分配正确:
import pytest from requests import post @pytest.mark.django_db def test_signup_with_website_1(): signup_url = "http://test-server/web/signup" payload = { 'email': 'test_user_1@example.com', 'password': 'test_pass123', 'website_id': '1' } response = post(signup_url, data=payload) assert response.status_code == 200 data = response.json() assert data['company_id'] == 'company_001' @pytest.mark.django_db def test_signup_with_website_2(): signup_url = "http://test-server/web/signup" payload = { 'email': 'test_user_2@example.com', 'password': 'test_pass123', 'website_id': '2' } response = post(signup_url, data=payload) assert response.status_code == 200 data = response.json() assert data['company_id'] == 'company_002'
注意事项
- 生产环境若需严格验证网站来源,可通过请求头
Host字段或域名映射确定网站,避免直接传递website_id被篡改。 - 测试时需保证测试环境用户数据独立,避免干扰生产数据。
内容的提问来源于stack exchange,提问作者Neural
相关产品推荐
相关产品推荐

