路由、表单、认证和中间件

20 阅读3分钟

URL 路由

Django 的 URL 路由系统用于将用户访问的 URL 与视图函数(views)进行匹配。Django 提供 path()re_path() 方法来定义路由规则。


1. 使用 path() 定义 URL

在 Django 项目的 urls.py 文件中,使用 path() 方法定义 URL 路由。

示例:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # 主页
    path('about/', views.about, name='about'),  # 关于页面
    path('article/<int:id>/', views.article_detail, name='article_detail'),  # 文章详情
]
  • '' 代表根路径,访问 / 时调用 index 视图。
  • <int:id> 是路径参数,表示 id 必须是整数。
  • name='article_detail' 赋予 URL 取名,以便在模板中使用 reverse() 生成 URL。

2. 使用 re_path() 定义正则表达式 URL

re_path() 允许使用正则表达式定义更复杂的 URL 规则。

示例:

from django.urls import re_path

urlpatterns = [
    re_path(r'^article/(?P<slug>[\w-]+)/$', views.article_by_slug, name='article_by_slug'),
]
  • (?P<slug>[\w-]+):匹配 slug,由字母、数字、下划线和短横线组成。
  • name='article_by_slug':提供 URL 反向解析。

3. 包含 namespace 以减少 URL 冲突

在 Django 项目中,可以使用 include() 和命名空间(namespace)来管理 URL,防止不同应用的 URL 发生冲突。

示例:在 project/urls.py

from django.urls import path, include

urlpatterns = [
    path('blog/', include(('blog.urls', 'blog'), namespace='blog')),
    path('shop/', include(('shop.urls', 'shop'), namespace='shop')),
]

blog/urls.pyshop/urls.py 中,定义自己的 URL 路由。

在模板中,使用命名空间调用 URL:

<a href="{% url 'blog:article_detail' id=5 %}">查看文章</a>

这样即使 shop 也有 article_detail 视图,也不会冲突。


表单处理

Django 提供 forms.Formforms.ModelForm 来处理表单输入、数据验证和用户提交。


1. 使用 forms.Form 创建表单

forms.Form 允许手动定义表单字段,并提供数据验证功能。

示例:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=100, required=True)
    email = forms.EmailField(required=True)
    message = forms.CharField(widget=forms.Textarea, required=True)

在视图 views.py 中处理表单:

from django.shortcuts import render
from .forms import ContactForm

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            print(form.cleaned_data)
    else:
        form = ContactForm()
    
    return render(request, 'contact.html', {'form': form})

在模板 contact.html 中渲染表单:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">提交</button>
</form>

2. 使用 forms.ModelForm 绑定数据库模型

如果表单数据需要存入数据库,可以使用 ModelForm

示例:

from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']

views.py 中:

def create_article(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = ArticleForm()
    
    return render(request, 'article_form.html', {'form': form})

用户认证与授权

Django 内置用户认证系统,支持用户登录、注册、权限管理等功能。


1. 用户登录

使用 Django 自带的 authenticate() 进行登录。

示例:

from django.contrib.auth import authenticate, login

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

login.html

<form method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <button type="submit">登录</button>
</form>

2. 用户注册

使用 UserCreationForm 快速创建用户注册表单:

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

class RegisterForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username', 'password1', 'password2']

在视图中:

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = RegisterForm()
    return render(request, 'register.html', {'form': form})

3. 用户授权

Django 提供权限系统,可通过 @permission_required 装饰器控制访问权限:

from django.contrib.auth.decorators import permission_required

@permission_required('app.view_article', raise_exception=True)
def view_article(request):
    return render(request, 'article.html')

中间件

Django 中间件是一种处理请求和响应的钩子,适用于修改请求、响应或执行额外的逻辑。


1. Django 内置中间件

settings.py 中配置:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

常见中间件:

  • SessionMiddleware:管理用户会话。
  • AuthenticationMiddleware:处理用户身份认证。
  • CsrfViewMiddleware:防止跨站请求伪造(CSRF)。
  • CommonMiddleware:提供通用功能,如 URL 规范化。

2. 自定义中间件

可以创建自定义中间件来拦截请求。

示例:

from django.utils.deprecation import MiddlewareMixin

class CustomMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("请求处理中...")

    def process_response(self, request, response):
        print("响应处理中...")
        return response

settings.py 中启用:

MIDDLEWARE.append('myapp.middleware.CustomMiddleware')

总结

  • Django 的 urls.py 负责 URL 路由管理,支持 path()re_path()
  • forms.FormModelForm 处理表单数据,提供数据验证功能。
  • Django 认证系统提供登录、注册、权限管理,并支持自定义用户模型。
  • 中间件用于处理请求和响应,可扩展 Django 功能。

这些知识点是 Django Web 开发的核心,掌握后可以构建复杂的 Web 应用。