【发布时间】:2018-05-02 03:20:48
【问题描述】:
我在从 Angular 4 发送到我创建的 Django Rest Framework API 的 HTTP 请求中的(我认为)授权标头相关的问题的任何地方找到答案时遇到问题。让我们开始吧:
编辑: 确认问题与授权有关,因为我现在也在使用 django-cors-headers 来摆脱 4200 端口的 CORS 问题(因为它被认为是不同的来源)。剩下的问题只是我在向 API 发出请求时收到“未经授权”的消息。我开始认为这是一个编码问题,因为当我尝试使用 httpie 进行以下请求时会显示以下消息:
http GET http://localhost:8000/api/groups/ "Authorization: Basic admin:password"
然后显示消息:
{
"detail": "Invalid basic header. Credentials not correctly base64 encoded."
}
在 settings.py 中,我确保权限类和身份验证类都可用。
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser'
],
...
CORS_ORIGIN_WHITELIST = [
'localhost:4200',
]
在views.py中,这可能是我的错,因为我在尝试从Angular发送请求时遇到控制台错误-> Rest API是'No'Access-Control-Allow-Origin'标头存在请求的资源。这是不真实的,因为当我删除身份验证需求时它不会抱怨这一点。
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = (IsAdminUser, )
authentication_classes = (BasicAuthentication, )
def list(self, request):
queryset = User.objects.all().order_by('-date_joined')
serializer = UserSerializer(queryset, many=True, context={'request': request})
return Response(serializer.data,
status=200)
Angular 开发服务器在 localhost:4200 上运行,而 django 保留在其默认的 localhost:8000 上。
我将包含 urls.py 以作好衡量:
from django.conf.urls import url, include
from rest_framework import routers
from backend.api import views
from django.contrib import admin
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'info', views.InfoViewSet)
urlpatterns = [
url(r'^api/', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^admin/', admin.site.urls),
]
请注意,我可以使用 httpie 使用授权标头发出请求并获得响应,如下所示:
http GET http://localhost:8000/api/users/ -a admin:password
最后,这是发出请求的 Angular 代码(我包含了所有内容,以便也可以检查导入):
import { Component, OnInit } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
title = 'app';
results: string[];
constructor(private http: HttpClient) {}
ngOnInit(): void {
this.http.get(
'http://localhost:8000/api/users/',
{ headers: new HttpHeaders().set('Authorization', 'Basic admin:password'), }
).subscribe(
data => {
this.results = data;
},
err => {
console.log("ERROR RETREIVING USERS");
});
}
}
我还导入了 HttpClientModule 并将其列在我的 app.module 中的“导入”下。
【问题讨论】:
-
嗨..试试他的.http.get
(url)
标签: django angular django-rest-framework