【问题标题】:Can django webapp and django-rest-framework live together?django webapp 和 django-rest-framework 可以一起生活吗?
【发布时间】:2019-08-06 01:05:52
【问题描述】:

我有一个 Django WebApp 来管理我的某些业务。它目前使用的是 Django 1.5.5,但我只是将代码迁移到了 Django 1.11。

问题是我们正在使用其他技术开发另一个应用程序,由于我所有的信息都在 Django 应用程序中,我决定将 Django Rest Framework 添加到我现有的 Django Webapp 中。到目前为止一切正常,漂亮,具有令牌访问权限的 API...快乐...

但是,后来我意识到在 PROD 环境中,我已经设置了 ALLOWED_HOST。 :(。我在我的 devbox 中添加了那行,幸福就结束了。

我尝试使用 django-cors-headers 添加 CORS 支持,但到目前为止,我还没有成功。

所以,为了避免浪费时间,我想问问比我更了解它的人,如果 Django 应用程序和 DRF API 可以一起生活,而无需删除 ALLOWED_HOST 设置或将其设置为 ALLOWED_HOSTS = ['* ']。

提前致谢!

更新

我的 settings.py 文件如下所示:

# Django settings for dojosite project.
# -*- coding:  utf-8 -*-
import os
import datetime

DEBUG = True

ALLOWED_HOSTS = ['www.myapp.com']

...

MIDDLEWARE_CLASSES = (
    'corsheaders.middleware.CorsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware'
)



TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [(os.path.join(ROOT_PATH, 'templates'),)],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.contrib.messages.context_processors.messages',
                'django.template.context_processors.media',
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    'django.contrib.humanize',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'rest_framework',
    'rest_framework.authtoken',
    'corsheaders',
    'myapp',
)

...

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissions',
    ]
}


# JWT settings
JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',

    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',

    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',

    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,

    'JWT_ALLOW_REFRESH': False,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
    'JWT_AUTH_COOKIE': None,
}

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False

该配置导致 ALLOWED_HOSTS 应用于 WebApp url 以及 API URL。

更新 2

我没有说的是我希望该 API 公开。我的意思是,假设我不知道哪些主机会调用我的 API。所以,我想做的是:

WebApp:应该只从已知主机调用(应该应用ALLOWED_HOSTS)

API: 可以从未知主机调用(此处不应应用 ALLOWED_HOSTS 控件)。

这可能吗?我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    是的,您可以毫无问题地将 Django Rest Framework 与您的 Django webapp 一起使用。转到 cors 部分,您应该首先安装 pip install django-cors-headers 然后将 corsheaders 添加到已安装的应用程序中

    INSTALLED_APPS = (
        ...
        'corsheaders',
        ...
    )
    

    settings.py中正确添加中间件

    MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
        ...
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ... ]
    

    最后你应该在settings.py 做,因为你允许每个主机

    CORS_ORIGIN_ALLOW_ALL = True

    加入白名单

    CORS_ORIGIN_WHITELIST = (
        'hostname.example.com',
        'localhost:8000',
        '127.0.0.1:9000'
    )
    

    【讨论】:

    • 你好@Yugandhar Chaudhari,我的项目就是这样设置的。我试图访问 web 应用程序 localhost:8000,但我得到了相应的错误。问题是使用 POSTMAN 访问我的登录端点,我也会收到 400 错误,并显示相同的消息:无效的 HTTP_HOST 标头:'localhost:8000'。您可能需要将 u'localhost' 添加到 ALLOWED_HOSTS。
    • 这里没有问题...如果您在 localhost 上运行服务器(或者如果您使用公共主机名运行服务器但也有东西通过 localhost 访问它(因为例如您有内部请求),您需要像上面所说的那样将 localhost 添加到 ALLOWED_HOSTS)
    • 谢谢@Foon ...请检查我的UPDATE 2。可能,我正在尝试做一些不可能做的事情
    • 认为您误解了 allowed_hosts 的作用。它控制 HTTP 请求的允许主机名,而不是允许哪些主机充当向 API 发出请求的客户端。我认为你是正确的(减去在不同的应用程序上运行你的网络应用程序和 API 并在它们前面抛出一个反向代理使其看起来像同一个服务器)你不能配置 Django 所以对 /api 的请求不使用ALLOWED_HOSTS 检查,但我也不认为这是你想要的
    • 嘿@Foon...让我解释一下真正的用例是什么,你可能会明白我想要做什么。正如我所说,我的 WebApp 控制着我的某些业务。所有的数据都在那里。我们现在正在做的是一个新的应用程序,它将在一台机器(独立应用程序)中运行,该机器需要使用我正在使用我的 Django 应用程序处理的信息来生成一些课程证书。正是出于这个原因,我决定将 DRF 包含在我的项目中。我的 API 中可以使用的 IP 不会一直为人所知。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2020-12-27
    • 1970-01-01
    相关资源
    最近更新 更多