django+framework+Vue第六天 用户登录和手机注册

1.drf自带的token(1)INSTALL_APP中添加INSTALLED_APPS = ( ... 'rest_framework.authtoken')token会生成一张表authtoken_token,所以要运行python manage.py makemigrationspython manage.py migrate(2)配置urlfrom rest_framework.authtoken import viewsurlpatterns = [
摘要由CSDN通过智能技术生成

新人学习django 是按照这个大佬的教程学习的
链接: https://www.cnblogs.com/derek1184405959/p/8733194.html.

很多步骤都是按照上面的教程学习的,这里只是记录一下自己学习的过程和一些错误
如果有人想要系统的学习,建议去上面那位大佬处学习

1.drf自带的token
(1)INSTALL_APP中添加

INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'
)

token会生成一张表authtoken_token,所以要运行python manage.py makemigrations
python manage.py migrate
在这里插入图片描述
(2)配置url

from rest_framework.authtoken import views


urlpatterns = [
   # drf自带的token认证
   path('api-token-auth/', views.obtain_auth_token)
]

postman发送数据
先创建一个superuser
python manage.py createsuperuser
然后再用postman发送数据
发送给http://127.0.0.1:9000/api-token-auth
图片中是弄混了
在这里插入图片描述
然后会返回token的值

drf的token缺点

保存在数据库中,如果是一个分布式的系统,就非常麻烦
token永久有效,没有过期时间。

2.json web token 方式完成用户认证

(1)安装jwt
使用方法
http://getblimp.github.io/django-rest-framework-jwt/

pip install djangorestframework-jwt

(2)配置

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    )
}

(3)配置url

 # jwt的token认证接口
    path('login/', obtain_jwt_token )

(4)postman发送数据
在这里插入图片描述
3.vue和jwt接口调试
vue中的登录接口

//登录
export const login = params => {
  return axios.post(`${local_host}/login/`, params)
}

接口更改完成
登录
在这里插入图片描述

jwt接口它默认采用的是用户名和密码登录验证,如果用手机登录的话,就会验证失败,所以我们需要自定义一个用户验证

自定义用户认证
settinds中配置

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现用户登陆注册需要以下步骤: 1. 安装 Django 和 MySQL 数据库,并创建一个 Django 项目。 2. 配置 MySQL 数据库信息,在 Django 项目的 settings.py 文件中设置 DATABASES。 3. 创建一个 Django 应用,在应用中定义用户模型,并在 settings.py 文件中设置 AUTH_USER_MODEL。 4. 在应用中创建视图函数和 URL,用于处理用户注册和登陆请求。 5. 使用 Vue 和 HTML 实现用户注册和登陆页面,并通过 Ajax 请求与 Django 后端交互。 下面是具体的实现步骤: 1. 安装 Django 和 MySQL 数据库,并创建一个 Django 项目。 假设你已经安装好了 Django 和 MySQL 数据库,并创建了一个名为 myproject 的 Django 项目。 2. 配置 MySQL 数据库信息,在 Django 项目的 settings.py 文件中设置 DATABASES。 打开 myproject/settings.py 文件,找到 DATABASES 配置项,将其配置为: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '3306', } } ``` 其中,'NAME'、'USER'、'PASSWORD'、'HOST'、'PORT' 分别为你的 MySQL 数据库的名称、用户名、密码、主机地址和端口号。 3. 创建一个 Django 应用,在应用中定义用户模型,并在 settings.py 文件中设置 AUTH_USER_MODEL。 打开终端,进入到 myproject 目录下,执行以下命令创建一个名为 accounts 的 Django 应用: ```bash python manage.py startapp accounts ``` 打开 accounts/models.py 文件,定义用户模型: ```python from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass ``` 这里使用 Django 内置的 AbstractUser 模型,继承它并添加一些额外的字段和方法。 打开 myproject/settings.py 文件,将 AUTH_USER_MODEL 设置为 accounts.User: ```python AUTH_USER_MODEL = 'accounts.User' ``` 这样就成功定义了一个用户模型,并且将其作为认证系统的用户模型。 4. 在应用中创建视图函数和 URL,用于处理用户注册和登陆请求。 打开 accounts/views.py 文件,定义用户注册和登陆的视图函数: ```python from django.shortcuts import render from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required from django.http import JsonResponse from .forms import RegistrationForm, LoginForm def registration(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): form.save() return JsonResponse({'success': True}) else: return JsonResponse({'success': False, 'errors': form.errors}) else: form = RegistrationForm() return render(request, 'registration.html', {'form': form}) def user_login(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] password = form.cleaned_data['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return JsonResponse({'success': True}) else: return JsonResponse({'success': False, 'errors': {'__all__': ['Invalid login credentials']}}) else: return JsonResponse({'success': False, 'errors': form.errors}) else: form = LoginForm() return render(request, 'login.html', {'form': form}) @login_required def home(request): return render(request, 'home.html') ``` 这里使用了 Django 内置的认证系统,authenticate 和 login 函数分别用于验证用户登录用户。 接下来,打开 accounts/forms.py 文件,定义用户注册和登陆表单: ```python from django import forms from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from .models import User class RegistrationForm(UserCreationForm): email = forms.EmailField(required=True) class Meta: model = User fields = ('username', 'email', 'password1', 'password2') def clean_email(self): email = self.cleaned_data.get('email') if User.objects.filter(email=email).exists(): raise ValidationError(_('Email already exists')) return email class LoginForm(AuthenticationForm): class Meta: model = User fields = ('username', 'password') ``` 这里使用了 Django 内置的表单类 UserCreationForm 和 AuthenticationForm,分别用于用户注册用户登陆。 最后,打开 accounts/urls.py 文件,定义 URL 路由: ```python from django.urls import path from . import views app_name = 'accounts' urlpatterns = [ path('register/', views.registration, name='registration'), path('login/', views.user_login, name='login'), path('home/', views.home, name='home'), ] ``` 这里定义了三个 URL 路由,分别用于用户注册用户登陆和用户主页。 5. 使用 Vue 和 HTML 实现用户注册和登陆页面,并通过 Ajax 请求与 Django 后端交互。 打开 templates/registration.html 文件,定义用户注册页面: ```html {% extends 'base.html' %} {% block content %} <h2>Register</h2> <form id="registration-form"> {% csrf_token %} <div class="form-group"> <label>Username:</label> {{ form.username }} </div> <div class="form-group"> <label>Email:</label> {{ form.email }} </div> <div class="form-group"> <label>Password:</label> {{ form.password1 }} </div> <div class="form-group"> <label>Confirm password:</label> {{ form.password2 }} </div> <button type="submit" class="btn btn-primary">Register</button> </form> <div id="registration-errors" class="text-danger"></div> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> const registrationForm = document.querySelector('#registration-form'); const registrationErrors = document.querySelector('#registration-errors'); registrationForm.addEventListener('submit', (event) => { event.preventDefault(); const formData = new FormData(registrationForm); axios.post('{% url "accounts:registration" %}', formData) .then(response => { if (response.data.success) { window.location.href = '{% url "accounts:home" %}'; } else { registrationErrors.innerHTML = Object.values(response.data.errors).join('<br>'); } }) .catch(error => { console.error(error); }); }); </script> {% endblock %} ``` 这里使用了 Bootstrap 和 Axios,分别用于样式和 Ajax 请求。当用户提交注册表单时,通过 Axios 发送 POST 请求到后端,如果注册成功,则跳转到用户主页,否则在页面上显示错误信息。 打开 templates/login.html 文件,定义用户登陆页面: ```html {% extends 'base.html' %} {% block content %} <h2>Login</h2> <form id="login-form"> {% csrf_token %} <div class="form-group"> <label>Username:</label> {{ form.username }} </div> <div class="form-group"> <label>Password:</label> {{ form.password }} </div> <button type="submit" class="btn btn-primary">Login</button> </form> <div id="login-errors" class="text-danger"></div> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> const loginForm = document.querySelector('#login-form'); const loginErrors = document.querySelector('#login-errors'); loginForm.addEventListener('submit', (event) => { event.preventDefault(); const formData = new FormData(loginForm); axios.post('{% url "accounts:login" %}', formData) .then(response => { if (response.data.success) { window.location.href = '{% url "accounts:home" %}'; } else { loginErrors.innerHTML = Object.values(response.data.errors).join('<br>'); } }) .catch(error => { console.error(error); }); }); </script> {% endblock %} ``` 这里与注册页面类似,通过 Axios 发送 POST 请求到后端,如果登陆成功,则跳转到用户主页,否则在页面上显示错误信息。 打开 templates/home.html 文件,定义用户主页: ```html {% extends 'base.html' %} {% block content %} <h2>Welcome, {{ request.user.username }}!</h2> <p>You are logged in.</p> {% endblock %} ``` 这里只是简单地显示一些欢迎信息。 最后,打开 templates/base.html 文件,定义网站的基础模板: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{% block title %}My Website{% endblock %}</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">My Website</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> {% if request.user.is_authenticated %} <li class="nav-item active"> <a class="nav-link" href="{% url "accounts:home" %}">Home <span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="{% url "logout" %}">Logout</a> </li> {% else %} <li class="nav-item"> <a class="nav-link" href="{% url "accounts:registration" %}">Register</a> </li> <li class="nav-item"> <a class="nav-link" href="{% url "accounts:login" %}">Login</a> </li> {% endif %} </ul> </div> </nav> <div class="container mt-4"> {% block content %}{% endblock %} </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script> </body> </html> ``` 这里使用了 Bootstrap 的导航条和响应式布局,根据用户是否已经登录来显示不同的导航链接。 至此,一个简单的 Django+MySQL+Vue+HTML 实现用户登陆注册的 web 应用就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值