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 应用。