如何在 django rest 中为基于函数的视图启用 cors 原点?

Posted

技术标签:

【中文标题】如何在 django rest 中为基于函数的视图启用 cors 原点?【英文标题】:How I can enable the cors origin for function-based view in djangorest? 【发布时间】:2020-03-28 18:48:20 【问题描述】:

我一直致力于对我的移动应用程序进行简单的身份验证(基于函数)。我一直想知道,因为该应用程序在 Web 上运行时正在运行(我使用的是 ionic4 ),但是当我尝试将应用程序运行到真实设备时,它无法正常工作。但是,注册视图的发布请求正在工作(在 Web 和真实设备中),并且它是由基于类的视图构成的。在我看来,这里唯一的问题是 cors-origin 因为其他视图(基于类的视图)正在工作。任何人都知道我如何设置基于函数的视图的 cors-origin 以允许所有传入响应?谢谢!

# For clinicians
@csrf_exempt
@api_view(["POST"])
def login_as_clinician(request):

    student_number = request.data.get('student_number')
    password = request.data.get('password')
    print(secrets.token_hex())

    isExist = Clinician.objects.filter(student_number=student_number, password=password).exists()

    if isExist:
        user = Clinician.objects.get(student_number=student_number, password=password)
        data =  'message' : 'successful', 'id' : user.id, 'student_number' : user.student_number, 'first_name' : user.first_name,
        'last_name' : user.last_name, 'middle_name' : user.middle_name, 'token' : secrets.token_hex(), 'clinic_level' : user.clinic_level 
        status = HTTP_200_OK
    else:
        data =  'message' : 'error' 
        status = HTTP_404_NOT_FOUND

    return Response(data, status=status)

这里是settings.py配置

# CORS Headers
CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]
MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    ...
]
INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

【问题讨论】:

您是否在settings.py 中设置了CORS_ORIGIN_WHITELIST 嗨@HuLuViCa,我已经在CORS_ORIGIN_ALLOW_ALL = Truesettings.py 中加入了这一行 【参考方案1】:

当您执行POST 请求时,它将与HEADERS 类似内容类型。所以你需要允许它。

所以在CORS_ORIGIN_ALLOW_ALL之后添加这个,

CORS_ALLOW_HEADERS = ('Content-Type')

每当您在标头中发送内容时,都需要在此处添加。否则你会得到 cors 错误。

【讨论】:

以上是关于如何在 django rest 中为基于函数的视图启用 cors 原点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

Django编写RESTful API:ViewSets和Routers

Django编写RESTful API:基于类的视图

Django编写RESTful API:ViewSets和Routers

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

在基于 django rest 类的视图中允许不同类型的用户使用不同的视图