更新:从Nginx配置中删除了set_header令牌。意识到这并没有帮助解决问题。我觉得问题是Django没有得到正确的标题,而且它们在某处“丢失”了。
我正在尝试为秘密的圣诞老人项目创建一个REST api。我设置它,以便用户必须先进行身份验证才能进行某些调用。这在我的本地计算机上运行良好,但在托管在任何地方时似乎都不起作用。
我在Heroku和ubuntu服务器上试过了。但是,我更喜欢让它在Ubuntu服务器上运行。我正在使用gunicorn和nginx为应用程序提供服务,但我在所有需要身份验证的调用上都收到“身份验证凭据”。我正在使用TokenAuthentication并在Authorization标头中使用前缀Token传递我的令牌。
非常感谢任何帮助。
settings.py
REST_FRAMEWORK = {
'PAGINATE_BY': 30,
'PAGINATE_BY_PARAM': 'per_page',
'MAX_PAGINATE_BY': 1000,
"DATETIME_FORMAT": "%Y-%m-%dT%H:%M:%S%z",
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
}
views.py
class RoomViewSet(mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
"""
Creates, Updates, and retrives Rooms
"""
queryset = Room.objects.all()
serializer_class = RoomSerializer
permission_classes = (IsAuthenticated, )
lookup_field = 'slug'
gunicorn.conf
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid dannywilson
setgid www-data
chdir /storage/sites/secret_santa/
exec santa/bin/gunicorn --pythonpath="$PWD/secret_santa" --bind=unix:"$PWD/secret_santa/gunicorn.sock" wsgi:application
nginx config
upstream test_server {
server unix:/storage/sites/secret_santa/secret_santa/gunicorn.sock;
}
server {
listen 80;
server_name webaddress;
access_log /storage/sites/_logs/secret_santa_api/nginx-access.log;
error_log /storage/sites/_logs/secret_santa_api/nginx-error.log;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_ignore_headers Cache-Control Expires Pragma;
if (!-f $request_filename) {
proxy_pass http://test_server;
break;
}
}
}
答案 0 :(得分:1)
这里有两件事让我感到震惊:
答案 1 :(得分:0)
因为以下配置:
REST_FRAMEWORK = {
........
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',],
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',),
}
如果您不需要身份验证,请删除此两个配置,否则如果您要使用TokenAuthentication
,则需要将rest_framework.authtoken
添加到已安装的应用中:
INSTALLED_APPS = (
...
'rest_framework.authtoken'
)
中的说明操作
答案 2 :(得分:-1)
请参阅Apache mod_wsgi特定配置:
https://www.django-rest-framework.org/api-guide/authentication/