Django WebApp和Django-Rest-Framework可以一起生活吗?



我有一个django webapp来管理我的业务某些事情。它目前正在使用Django 1.5.5,但我只是将代码迁移到Django 1.11。

问题是我们正在使用其他技术开发另一个应用程序,并且由于我的所有信息都在Django应用程序中,因此我决定将Django Rest Framework添加到我现有的Django WebApp中。到目前为止,一切都很好,美丽,带有令牌访问的API ...快乐...

,但是,然后我意识到在prod env上,我允许_host设置。:(。我在开发箱中添加了该行,幸福结束了。

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

所以,为了避免浪费时间,我想向我比我了解更多的人,如果Django App和DRF API可以一起生活,而无需删除允许的_host设置或将其设置为washer_hosts ='*'* [**']。

预先感谢!

update

我的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

配置导致允许的_host应用于WebApp URL,也将其应用于API URL。

更新2

我没有说的话,是我想要那个API公众。我的意思是,让我们假设我不知道哪些宿主会调用我的API。所以,我想做的是:

webApp:应该从已知主机调用(应应用允许的host)

API:可以从未知主机调用(允许的_hosts控件不应在此处应用)。

这可能吗?我该如何实现?

谢谢!

是的,您可以将Django REST框架与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'
)

最新更新