首页 > 解决方案 > 如何构建 DRF API 并在同一个项目中使用它

问题描述

我正在研究 DRF API,我想在同一个项目上使用 API,而不是使用 Django ORM 结构,

我已成功登录用户并生成了令牌。现在我想根据 API 调用的响应来限制 Django 视图

class Login(generic.FormView):
    template_name = 'registration/login.html'
    form_class = LoginForm
    success_url = reverse_lazy('customer_dashboard')

    def form_valid(self, form):
        parameters = {
            'username': str(form.cleaned_data['username']),
            'password': str(form.cleaned_data['password']),
        }
        #  Param from LOGIN form posted to API, if token response, means user is authenticated and active
        headers = {"Content-Type": 'application/json'}
        response = requests.post(str(settings.API_END_POINT + '/api-token-auth/'), json=parameters, headers=headers)
        data = response.json()

        #  response CODE 2xx means a success, if POST request is success, then save USE TOKEN and ID to session
        if response.status_code in settings.SUCCESS_CODES:
            self.request.session['validated_user_token'] = data['token']
            self.request.session['validated_user_id'] = data['user_id']

            #  get request from all_user end_point and match USER ID from before to list to fetch user details
            headers = {"Content-Type": 'application/json', "Authorization": "Token " + settings.API_TOKEN}
            response = requests.get(str(settings.API_END_POINT + '/users_api/'),  headers=headers)
            users = response.json()

            print(self.request.session['validated_user_id'])
            for user in users:
                if user['id'] == self.request.session['validated_user_id']:
                    messages.success(self.request, 'Hi' + ' ' + user['first_name'] + ' ' + user['last_name'])
        else:
            messages.error(self.request, 'Invalid Credentials')

        return super(Login, self).form_valid(form)

在这里,我将用户名和密码传递给 API 发布请求,用于验证凭据并返回 Token 和 User_id。现在基于我想将仪表板(下面的代码)限制为上面经过身份验证的那些用户。

class CustomerDashboard(generic.TemplateView):
    template_name = 'customer/dashboard.html'

我希望将 CustomerDashboard() 限制为已通过 API 调用验证的用户

标签: djangodjango-rest-frameworkdjango-views

解决方案


我不知道您为什么实际上使登录变得如此复杂。您可以使用内置身份验证。您可以针对任何其他功能进行调整。

网址.py

from django.contrib.auth import views

urlpatterns = [
    path('login/', views.LoginView.as_view(redirect_authenticated_user=True), name='login'),
    path('dashboard/', dashboard.Dashboard.as_view(), name='dashboard'),
]

视图.py

from django.contrib.auth.mixins import LoginRequiredMixin
class Dashboard(LoginRequiredMixin, generic.TemplateView):
    template_name = "dashboard.html"
    ...

这对我来说非常好。


推荐阅读