Python Django 实现简单注册功能过程详解

yizhihongxing

下面我将详细讲解“Python Django 实现简单注册功能过程”的完整攻略。本攻略分为以下几个部分:

  1. 创建 Django 项目和应用
  2. 安装、配置和使用 Django 自带的认证系统
  3. 自定义认证系统
  4. 实现简单注册功能
  5. 示例一:使用 Django 自带的认证系统实现注册和登录功能
  6. 示例二:自定义认证系统实现注册和登录功能

1. 创建 Django 项目和应用

首先,你需要安装好 Django。然后在命令行中输入以下命令来创建一个 Django 项目:

django-admin startproject mysite

这将创建一个名为 mysite 的项目。接下来,你需要创建一个应用程序。在命令行中输入以下命令:

python manage.py startapp authsystem

这将在项目中创建一个名为 authsystem 的应用程序。接下来,你需要将应用程序添加到项目的 settings.py 文件中。打开 mysite/settings.py,并在 INSTALLED_APPS 中添加 authsystem

INSTALLED_APPS = [
    ...
    'authsystem',
]

2. 安装、配置和使用 Django 自带的认证系统

Django 自带了一个强大的认证系统,可以轻松实现用户注册、登录、注销、密码重置等功能。下面是如何使用它的步骤:

2.1 安装

Django 自带的认证系统已经包含在 Django 的安装包中,所以你不需要另外安装。

2.2 配置

mysite/settings.py 文件中,你需要设置以下两个参数:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

LOGIN_REDIRECT_URL = '/'

第一个参数指定了认证后端,即 Django 使用哪个认证后端来验证用户。在这里我们使用了默认的 ModelBackend。第二个参数指定了用户登录后要重定向到的 URL。

2.3 使用

authsystem/views.py 中,你可以使用 Django 自带的视图来实现用户注册、登录、注销等功能。以下是几个常用的视图:

2.3.1 注册视图

使用 django.contrib.auth.views 中的 RegistrationView 来实现用户注册视图:

from django.contrib.auth.views import RegistrationView

class MyRegistrationView(RegistrationView):
    template_name = 'registration/register.html'

authsystem/urls.py 中添加以下 URL:

from django.urls import path
from .views import MyRegistrationView

urlpatterns = [
    path('register/', MyRegistrationView.as_view(), name='register'),
]

现在你可以通过 /register/ 访问注册页面了。

2.3.2 登录视图

使用 django.contrib.auth.views 中的 LoginView 来实现用户登录视图:

from django.contrib.auth.views import LoginView

class MyLoginView(LoginView):
    template_name = 'registration/login.html'

authsystem/urls.py 中添加以下 URL:

from django.urls import path
from .views import MyLoginView

urlpatterns = [
    path('login/', MyLoginView.as_view(), name='login'),
]

现在你可以通过 /login/ 访问登录页面了。

2.3.3 注销视图

使用 django.contrib.auth.views 中的 LogoutView 来实现用户注销视图:

from django.contrib.auth.views import LogoutView

class MyLogoutView(LogoutView):
    next_page = '/'

authsystem/urls.py 中添加以下 URL:

from django.urls import path
from .views import MyLogoutView

urlpatterns = [
    path('logout/', MyLogoutView.as_view(), name='logout'),
]

现在你可以通过 /logout/ 注销用户了。

3. 自定义认证系统

如果你需要对认证系统进行更高级别的定制,你可以使用 Django 提供的 AuthenticationBackend。下面是如何自定义认证系统:

3.1 创建认证后端

创建一个类来实现你的认证后端。在 authsystem/backends.py 中创建一个名为 MyBackend 的类。以下是一个示例:

from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.models import User

class MyBackend(BaseBackend):

    def authenticate(self, request, username=None, password=None):
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

这个类中有两个方法:

  • authenticate:用来验证用户的用户名和密码。
  • get_user:用来获取用户对象。

3.2 配置认证后端

mysite/settings.py 中添加你的认证后端类:

AUTHENTICATION_BACKENDS = [
    'authsystem.backends.MyBackend',
]

3.3 使用认证后端

现在你可以使用 authenticatelogin 函数来实现用户认证和登录。以下是一个示例:

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            return redirect('home')
    return render(request, 'login.html')

4. 实现简单注册功能

现在你已经知道如何创建 Django 项目和应用,如何使用 Django 自带的认证系统,以及如何自定义认证系统。接下来,我们将使用 Django 自带的模型来创建简单的注册功能。

4.1 创建模型

authsystem/models.py 中创建一个名为 UserProfile 的模型,用于扩展 Django 默认的用户模型:

from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone_number = models.CharField(max_length=20, blank=True)
    address = models.CharField(max_length=255, blank=True)

这个模型有两个附加字段:

  • phone_number:电话号码。
  • address:地址。

4.2 创建表单

authsystem/forms.py 中创建一个名为 RegistrationForm 的表单:

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from .models import UserProfile

class RegistrationForm(UserCreationForm):
    phone_number = forms.CharField(max_length=20, required=False)
    address = forms.CharField(max_length=255, required=False)

    class Meta:
        model = User
        fields = ('username', 'password1', 'password2', 'email', 'first_name', 'last_name', 'phone_number', 'address')

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        if commit:
            user.save()
            profile = UserProfile.objects.create(user=user, phone_number=self.cleaned_data['phone_number'], address=self.cleaned_data['address'])
            profile.save()
        return user

这个表单继承了 Django 自带的 UserCreationForm,并添加了两个附加字段。在 save 方法中,我们创建了一个新的 UserProfile 对象,并将其与新创建的用户对象关联起来。

4.3 创建视图

authsystem/views.py 中,创建名为 register 的视图:

from django.contrib.auth import login
from django.shortcuts import render, redirect
from .forms import RegistrationForm

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')
    else:
        form = RegistrationForm()

    return render(request, 'registration/register.html', {'form': form})

register 方法中,我们检查请求是否为 POST,并调用 RegistrationForm 来创建一个新的用户。如果表单验证通过,我们调用 login 函数将用户设置为当前会话的用户,并使用 redirect 函数将用户重定向到主页。

4.4 创建模板

authsystem/templates/registration 中创建名为 register.html 的模板:

{% extends 'base.html' %}

{% block content %}
  <h2>Register</h2>
  <form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Register">
  </form>
{% endblock %}

这个模板渲染了一个名为 form 的表单。

5. 示例一:使用 Django 自带的认证系统实现注册和登录功能

现在,我们已经知道如何实现基本的用户注册功能。接下来,我们将使用 Django 自带的认证系统来实现用户注册和登录功能。

authsystem/views.py 中,添加以下代码:

from django.contrib.auth.views import LoginView, LogoutView, PasswordResetView, PasswordResetConfirmView
from django.views.generic import CreateView
from django.urls import reverse_lazy

from .forms import RegistrationForm
from .models import UserProfile

class MyLoginView(LoginView):
    template_name = 'registration/login.html'

class MyLogoutView(LogoutView):
    next_page = '/'

class MyPasswordResetView(PasswordResetView):
    success_url = '/login/'

class MyPasswordResetConfirmView(PasswordResetConfirmView):
    success_url = '/login/'

class MyRegistrationView(CreateView):
    template_name = 'registration/register.html'
    form_class = RegistrationForm
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        response = super().form_valid(form)
        user = self.object
        UserProfile.objects.create(user=user, phone_number=form.cleaned_data['phone_number'], address=form.cleaned_data['address'])
        return response

authsystem/urls.py 中添加以下 URL:

from django.urls import path
from .views import MyLoginView, MyLogoutView, MyRegistrationView, MyPasswordResetView, MyPasswordResetConfirmView

urlpatterns = [
    path('login/', MyLoginView.as_view(), name='login'),
    path('logout/', MyLogoutView.as_view(), name='logout'),
    path('password_reset/', MyPasswordResetView.as_view(), name='password_reset'),
    path('password_reset_confirm/<uidb64>/<token>/', MyPasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('register/', MyRegistrationView.as_view(), name='register'),
]

现在你可以通过以下 URL 访问这些视图:

  • /login/:登录页面
  • /logout/:注销页面
  • /password_reset/:重置密码页面
  • /password_reset_confirm/<uidb64>/<token>/:确认密码重置页面
  • /register/:注册页面

6. 示例二:自定义认证系统实现注册和登录功能

authsystem/backends.py 中添加以下代码:

class MyBackend(BaseBackend):

    def authenticate(self, request, username=None, password=None):
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

class MyRegistrationView(CreateView):
    template_name = 'registration/register.html'
    form_class = RegistrationForm
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        response = super().form_valid(form)
        user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
        login(self.request, user)
        UserProfile.objects.create(user=user, phone_number=form.cleaned_data['phone_number'], address=form.cleaned_data['address'])
        return response

class MyLoginView(FormView):
    template_name = 'registration/login.html'
    form_class = AuthenticationForm
    success_url = '/'

    def form_valid(self, form):
        user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password'])
        if user is not None:
            login(self.request, user)
            return super(MyLoginView, self).form_valid(form)
        else:
            return self.form_invalid(form)

authsystem/urls.py 中添加以下 URL:

from django.urls import path
from .views import MyRegistrationView, MyLoginView

urlpatterns = [
    path('login/', MyLoginView.as_view(), name='login'),
    path('register/', MyRegistrationView.as_view(), name='register'),
]

现在你可以使用 /login//register/ URL 来访问这些视图。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Django 实现简单注册功能过程详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django中model下都有哪些方法

    通过名称检索模型的单个字段实例 _meta.get_field()返回给定一个字段名称的字段实例,如果没有找到具体给定的字段,将会引发一个FieldDoesNotExist 异常 from django.contrib.auth.models import User >>>User._meta.get_field(‘username’) &…

    Django 2023年4月13日
    00
  • Django学习之路之请求与响应

    针对您提出的问题,本篇回答将主要包括以下几个部分: 理解请求和响应的含义及基本原理; 掌握Django框架中HTTP请求和响应的相关知识; 示例说明,演示Django中请求与响应的实现方法。 1. 请求和响应的含义及基本原理 在Web应用中,浏览器向服务器发送数据,服务器会处理这些数据,然后再返回给浏览器一些数据,这个过程就称为请求和响应。 请求(Reque…

    Django 2023年5月16日
    00
  • 【django】admin 后台自定义按钮 传参

    class NongYeInfomation(models.Model): “”” 农业资讯 “”” title = models.CharField(max_length=255,verbose_name=”标题”) url = models.CharField(max_length=255,verbose_name=”路由”) create_time =…

    Django 2023年4月12日
    00
  • Python的Django框架中forms表单类的使用方法详解

    Python Django框架中forms表单类的使用方法详解 在 Django 框架中使用 forms 表单类是非常方便的。本文将详细解释如何创建和使用 forms 表单类。 创建forms表单类 要创建表单类,您需要导入 Django 的 forms 模块并创建一个类。类定义包括表单字段以及它们的验证规则。下面是一个简单的表单类示例: from djan…

    Django 2023年5月16日
    00
  • Python 做Django 项目遇到问题:Not Found: /c_hello(或/c_webskt/)

    出现如图所示的情况,一般先看端口是否被占用,或者更换端口号重新启动服务 查看指定端口占用情况netstat -aon | findstr 8000 查看对应PID进程tasklist|findstr “18836” 结束该进程taskkill /f /t /im CLodopPrint32.exe

    Django 2023年4月13日
    00
  • django面试题

    哪些class可以继承 #class View(object): #class APIView(View): 封装了view,并且重新封装了request,初始化了各种组件 #class GenericAPIView(views.APIView): #1.增加了一些属性和方法,如get_queryset,get_serializer #class Gener…

    Django 2023年4月9日
    00
  • django 修改后台的名称及应用名称

    后台顶部标题的修改app/admin.py中设置 admin.site.site_title = “智能对话机器人后台管理” admin.site.site_header = “机器人后台管理 smart AI” 应用的名称修改 第一步:修改apps.py文件在name所在行下方增加 verbose_name=u”应用名称”    第二步:修改__init_…

    Django 2023年4月16日
    00
  • DJANGO复制记录的方法(转载)

    DJANGO复制记录的方法 https://dmyz.org/archives/326 最近的Django项目中有复制记录的需求。数据库里有一张名为Party的表,记录用户创建的party,现在要让用户能够复制一个新的party。本身非常简单的一个功能,但运行的时候出错了。我以为是复制过程出错,所以测试了一下Django中复制记录可能遇到的情况(后来发现是其…

    Django 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部