请求Django multitenant API中的特定视图

2024-04-24 07:51:56 发布

您现在位置:Python中文网/ 问答频道 /正文

使用django-tenant-schemas==1.10.0在Django 2.2.17中创建了一个多租户API,目前正在使用Postman对其进行测试

我能够创建一个新的组织(即租户)并获得所有这些组织

enter image description here

问题是,在对端点的GET和POST请求中http://127.0.0.1:8000/employee/我得到了

AttributeError at /employee/

'str' object has no attribute 'get'

enter image description here

这是我的员工/views.py

from django.shortcuts import render
from employee.models import Employee
from organization.models import Organization
from django.http import JsonResponse,request, HttpResponse
from django.views import View
from tenant_schemas.utils import schema_context
import json

# Create your views here.
class EmployeeView(View):

    def get(self, request, *args, **kwargs):
        try:
            organizations = Organization.objects.get(domain_url=request.META['HTTP_HOST'])
            schema_name = organizations["schema_name"]
            #schema_name = organizations.schema_name
        except Organization.DoesNotExist:
            return "no organization"

        with schema_context(schema_name):
            employees = Employee.objects.all()
            data = {"results": list(employees.values("id","name"))}
            return JsonResponse(data)


    def post(self, request, *args, **kwargs):
        try:
            organizations = Organization.objects.get(domain_url=request.META['HTTP_HOST'])
            schema_name = organizations.schema_name
        except Organization.DoesNotExist:
            return "no organization"

        with schema_context(schema_name):
            name = json.loads(request.body)['name']
            employee = Employee(name=name)
            employee.save()
            return "Employee added successfully"

这是终端的输出

Internal Server Error: /employee/
Traceback (most recent call last):
  File "C:\Users\tiago\Desktop\django\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\tiago\Desktop\django\venv\lib\site-packages\django\utils\deprecation.py", line 96, in __call__
    response = self.process_response(request, response)
  File "C:\Users\tiago\Desktop\django\venv\lib\site-packages\django\middleware\clickjacking.py", line 26, in process_response
    if response.get('X-Frame-Options') is not None:
AttributeError: 'str' object has no attribute 'get'
[18/Jan/2021 19:56:01] "GET /employee/ HTTP/1.1" 500 64243

这是《邮递员》的追踪

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/employee/

Django Version: 2.2.17
Python Version: 3.9.0
Installed Applications:
['tenant_schemas',
 'organization',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'employee']
Installed Middleware:
['tenant_schemas.middleware.TenantMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\tiago\Desktop\django\venv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\tiago\Desktop\django\venv\lib\site-packages\django\utils\deprecation.py" in __call__
  96.             response = self.process_response(request, response)

File "C:\Users\tiago\Desktop\django\venv\lib\site-packages\django\middleware\clickjacking.py" in process_response
  26.         if response.get('X-Frame-Options') is not None:

Exception Type: AttributeError at /employee/
Exception Value: 'str' object has no attribute 'get'

Tags: djangonamefrompyimportgetresponserequest
1条回答
网友
1楼 · 发布于 2024-04-24 07:51:56

看起来您正在从视图返回原始字符串。您需要返回HttpResponse的实例(或使用render,等等)

例如,您具有以下功能:

def get(self, request, *args, **kwargs):
    try:
        organizations = Organization.objects.get(domain_url=request.META['HTTP_HOST'])
        schema_name = organizations["schema_name"]
        #schema_name = organizations.schema_name
    except Organization.DoesNotExist:
        return "no organization"

它击中了return "no organization"代码分支,这打破了Django对中间件的期望

相关问题 更多 >