django - 如何构建 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 调用验证的用户
解决方案
我不知道您为什么实际上使登录变得如此复杂。您可以使用内置身份验证。您可以针对任何其他功能进行调整。
网址.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"
...
这对我来说非常好。
推荐阅读
- mysql - MySQL 无法第二次登录并出现错误消息:用户'root'@'localhost' 的访问被拒绝(使用密码:是)
- vue.js - Parcel 尝试从 npm 安装自定义 vue 组件
- php - PHP:是否可以保存网站,模拟手动保存?
- python - 在“from_delayed”JSON 文件中发现 DASK 元数据不匹配
- video - ffmpeg 删除 mp4 文件中的一部分音频,但不是全部
- python - 桥接关系表的 Sqlalchemy 事件
- sass - 仅输出使用某些变量的样式?
- c# - 如何基于实体框架代码优先模型自动生成.mdf db如果不存在
- php - 是否有可能获得函数的静态值?
- javascript - firebase.database() 不是函数