python - django webapp 和 django-rest-framework 可以一起生活吗?
问题描述
我有一个 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 控件)。
这可能吗?我怎样才能做到这一点?
谢谢!
解决方案
是的,您可以毫无问题地将 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'
)
推荐阅读
- reactjs - PropType 已定义但从未使用过 eslint 错误
- linux - 文件未列出 git status 并在提交后丢失
- c# - 如何以正确的格式拆分字符串
- python - 在另一台 PC 上运行 python 脚本
- java - 无法克隆数据
- maven - 是否可以创建命名空间或逻辑组来对 GraphQL 中的查询/突变进行分组?
- javascript - 想要在警报框中的 jsp 页面上显示控制器消息
- github - GitHub 抛出“GitHug 无法构建页面”错误,这是为什么呢?
- java - 导航到列表 Cardview 中的不同活动
- php - 如果 PHP 中的条件为真,如何从目录中删除旧文件?