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.py 和 shop/urls.py 中,定义自己的 URL 路由。
在模板中,使用命名空间调用 URL:
<a href="{% url 'blog:article_detail' id=5 %}">查看文章</a>
这样即使 shop 也有 article_detail 视图,也不会冲突。
表单处理
Django 提供 forms.Form 和 forms.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.Form和ModelForm处理表单数据,提供数据验证功能。- Django 认证系统提供登录、注册、权限管理,并支持自定义用户模型。
- 中间件用于处理请求和响应,可扩展 Django 功能。
这些知识点是 Django Web 开发的核心,掌握后可以构建复杂的 Web 应用。