【问题标题】:Django Authentication Token, can't open the admin pageDjango Authentication Token,无法打开管理页面
【发布时间】:2018-04-14 13:48:32
【问题描述】:

我正在尝试使用令牌身份验证来验证我的用户,问题是我不知道如何使用令牌添加标题,所以我可以进入我的管理面板。在我实现这个方法之前,如果我输入 http://127.0.0.1:8000/admin 我可以毫无问题地访问它。

这是我的models.py

class Stock(models.Model):
    ticker = models.CharField(max_length=10)
    open = models.FloatField()
    close = models.FloatField()
    volume = models.IntegerField()

    def __str__(self):
        return self.ticker


# This code is triggered whenever a new user has been created and saved to the database
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

这是我的views.py(我认为这是我必须改变一些东西):

@api_view(['GET', 'POST'])
def stock_list(request, format=None):
    if request.method == 'GET':
        stocks = Stock.objects.all()
        serializer = StockSerializer(stocks, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = StockSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'POST', 'DELETE'])
def stock_detail(request, pk, format=None):
    try:
        stock = Stock.objects.get(pk=pk)
    except Stock.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = StockSerializer(stock)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = StockSerializer(stock, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        stock.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

这是我的网址应用程序:

urlpatterns = [
    url(r'^stocks/$', views.stock_list),
    url(r'^stocks/(?P<pk>[0-9]+)$', views.stock_detail),

]

urlpatterns = format_suffix_patterns(urlpatterns)

这是我的 url 项目:

urlpatterns = [
    url(r'^', include('companies.urls')),
    url(r'^api-token-auth/', views.obtain_auth_token),
]

我知道令牌是在用户注册时创建的,如果我输入:

curl --data "username=admin&password=password" http://127.0.0.1:8000/api-token-auth/

我获得了管理员的令牌,知道如何添加带有令牌的标头吗?

【问题讨论】:

  • 这取决于您的要求。方法/语法将被语言改变,如.. postman、python、js,但基本上你只需要在 headers 中传递令牌

标签: django authentication


【解决方案1】:

添加标头的确切方法将根据您提出请求的方式而改变 但 bewlo 行应包含在标题中以验证用户

Authorization:Token <token>

确保您已将 'rest_framework.authentication.TokenAuthentication' 包含在您的 DEFAULT_AUTHENTICATION_CLASSES 的其余框架中

EX.

示例 curl 请求:

curl -X GET http://127.0.0.1:8000/api/example/ -H 'Authorization: Token <token>'

在python脚本中你可以执行以下命令:

import requests

headers = {
    'content-type': "application/json",
    'authorization': "Token <token>",
    }

response = requests.request("<request-typle>", <url>, data=<payload-if-any>, headers=headers)  # while making nay request you need to mention headers as dictionary and `authorization` key to specify token

如果你正在编写测试,那么你可以这样写:

self.client.credentials(HTTP_AUTHORIZATION='Token ' + <token>)

阅读this线程中的详细信息

【讨论】:

  • 知道如何再次使用管理面板吗?当我尝试像这样输入时:127.0.0.1:8000/admin 它不再起作用了
  • 你没有 urlpatterns
  • 有没有人知道如何使用管理面板,同时仍然实现 Token 身份验证?
  • @Xceptions Token 身份验证不会以任何方式影响管理面板,正如前面已经说过的,您按照管理面板的程序进行操作,即为其添加 urlpatterns 它将起作用!跨度>
  • 是的,谢谢,我已经弄清楚了。该 api 应创建为与管理面板运行所在的主应用程序不同的应用程序。
猜你喜欢
  • 2015-01-26
  • 2020-08-05
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多