Python Django完整教程与代码示例 - 指南
边写代码零食不停口盼盼麦香鸡味块 、卡乐比(Calbee)薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸
边写代码边贴面膜 事业美丽两不误DR. YS 野森博士+【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合优惠劵
别光顾写代码更要多喝茶水,提神有营养六安瓜片茶叶茶香二级200g 2025年新茶雨前盒装自己喝
让AI成为大家的得力助手:《用Cursor玩转AI辅助编程——不写代码也能做软件开发》
Python Django 简介
Django是一个基于 Python 的高级Web 开发框架,遵循 “MTV”(模型-模板-视图)设计模式(类似于 MVC)。它以高效、安全、可扩展著称,辅助开发者快速构建高质量的 Web 应用。
核心特点
- 开箱即用
- 自带用户认证、后台管理、ORM、表单处理等模块。
- 无需重复造轮子,大幅提升开发效率。
- 安全优先
- 自动防御 SQL 注入、XSS、CSRF 等常见攻击。
- 高可扩展性
- 帮助从小型博客到百万级用户平台(如 Instagram、Pinterest)。
- DRY 原则
- 遵循 Don’t Repeat Yourself,代码高度复用。
核心组件
| 组件 | 作用 |
|---|---|
| 模型 (Model) | 用 Python 类定义数据结构,自动生成数据库表(支持 PostgreSQL/MySQL 等)。 |
| 视图 (View) | 处理业务逻辑,接收请求并返回响应(HTML/JSON 等)。 |
| 模板 (Template) | 用 HTML + Django 模板语法动态渲染页面。 |
| 路由 (URLconf) | 将 URL 映射到对应的视图函数。 |
⚙️ 工作流程
graph LR A[用户请求] --> B(URL路由) B --> C[视图处理] C --> D{运行数据库?} D -- 是 --> E[模型读写] E --> F[返回数据] D -- 否 --> G[直接响应] F --> H[模板渲染] H --> I[返回HTML] G --> I Django 自带工具
- Admin 后台:自动生成数据管理界面。
- ORM 系统:用 Python 处理数据库,无需写 SQL。
- 表单处理:验证用户输入并自动渲染表单。
- 缓存机制:支持 Memcached、Redis 等提升性能。
- 国际化:内置多语言支持。
Django 基础部分
1. 环境安装与项目创建
# 安装Djangopip install django# 创建项目django-admin startproject myproject# 目录结构: # myproject/ # manage.py # myproject/ # __init__.py # settings.py # urls.py # asgi.py # wsgi.py 2. 创建应用
python manage.py startapp myapp 3. 基础视图与URL配置
myapp/views.py:
fromdjango.http importHttpResponsedef hello(request): # 简单视图函数 returnHttpResponse("Hello Django!" ) myproject/urls.py:
fromdjango.urls import path from myapp importviews urlpatterns= [ path('hello/' , views.hello) , ] 4. 运行开发服务器
python manage.py runserver# 访问 http://127.0.0.1:8000/hello/ Django 模型层
1. 定义模型
myapp/models.py:
fromdjango.db importmodelsclass Book(models.Model): # 字符字段,最大长度100 title =models.CharField(max_length=100 ) # 作者字段,可为空author=models.CharField(max_length=50 , null=True ) # 出版日期pub_date=models.DateField( ) # 价格(带小数) price =models.DecimalField(max_digits=5 ,decimal_places=2 ) # 自动记录创建时间created_at=models.DateTimeField(auto_now_add=True ) def __str__(self): return self.title 2. 激活模型
myproject/settings.py:
INSTALLED_APPS= [ ... 'myapp.apps.MyappConfig' , # 添加应用 ] 3. 数据库迁移
python manage.py makemigrations# 创建迁移文件python manage.py migrate# 应用迁移 4. 数据库操作示例
# 创建记录 from myapp.modelsimport Book fromdatetimeimportdate book= Book.objects.create( title="Django for Beginners" ,author="William S. Vincent" ,pub_date=date(2023 , 5 , 15 ) , price=29.99 ) # 查询记录 books = Book.objects.filter(price__lt=30 ) # 价格<30的书籍recent_books= Book.objects.order_by('-pub_date' )[:5] # 最新5本书 # 更新记录 book.price = 24.99 book.save( ) # 删除记录 book.delete( ) Django 视图进阶
1. 类视图
myapp/views.py:
fromdjango.views.genericimportListView,DetailViewfrom .modelsimport Book class BookListView(ListView): model =Book template_name= 'book_list.html'context_object_name= 'books' class BookDetailView(DetailView): model =Book template_name= 'book_detail.html'pk_url_kwarg= 'book_id' # URL中的参数名 2. URL配置
myapp/urls.py:
fromdjango.urls import path from .views importBookListView,BookDetailView urlpatterns= [ path('books/' ,BookListView.as_view( ) , name='book-list' ) , path('books/<int:book_id>/' ,BookDetailView.as_view( ) , name='book-detail' ) , ] Django 模板平台
1. 模板配备
myproject/settings.py:
TEMPLATES= [ { 'DIRS': [BASE_DIR/ 'templates'] , # 全局模板目录 } , ] 2. 基础模板templates/base.html
<!
DOCTYPE html>
<html>
<head>
<title>{% block title %}My Site{% endblock %}
</title>
</head>
<body>
<nav>...
</nav>
<div class="content"
>{% block content %}{% endblock %}
</div>
</body>
</html> 3. 子模板templates/book_list.html
{% extends "base.html" %} {% block title %}Book List{% endblock %} {% block content %}
<h1>Book List
</h1>
<ul>{% for book in books %}
<li>
<a href="{% url 'book-detail' book.id %}"
>{{ book.title }} - {{ book.author }}
</a>
</li>{% empty %}
<li>No books available
</li>{% endfor %}
</ul>{% endblock %} Django 表单处理
1. 模型表单
myapp/forms.py:
fromdjangoimport forms from .modelsimport Book class BookForm(forms.ModelForm): class Meta: model =Book fields= ['title' , 'author' , 'pub_date' , 'price']widgets= { 'pub_date': forms.DateInput(attrs={ 'type': 'date' } ) , } 2. 表单视图
myapp/views.py:
fromdjango.views.generic.edit importCreateViewfrom .forms importBookFormclass BookCreateView(CreateView): model =Book form_class=BookForm template_name= 'book_form.html'success_url= '/books/' # 提交成功后重定向 3. 模板 templates/book_form.html
<form method="post"
>{% csrf_token %} {{ form.as_p }}
<button type="submit"
>Save
</button>
</form> Django Admin 后台
1. 注册模型
myapp/admin.py:
fromdjango.contribimport admin from .modelsimport Book @admin.register(Book) class BookAdmin(admin.ModelAdmin):list_display= ('title' , 'author' , 'price' , 'pub_date' )list_filter= ('author' , 'pub_date' )search_fields= ('title' , 'author' )date_hierarchy= 'pub_date' 2. 创建管理员
python manage.py createsuperuser Django 用户认证
1. 登录视图
myproject/urls.py:
fromdjango.contrib.auth import views asauth_views urlpatterns= [ path('login/' ,auth_views.LoginView.as_view(template_name='login.html' ) , name='login' ) , path('logout/' ,auth_views.LogoutView.as_view( ) , name='logout' ) , ] 2. 登录模板templates/login.html
<form method="post"
>{% csrf_token %} {{ form.as_p }}
<button type="submit"
>Login
</button>
</form> 3. 视图权限控制
fromdjango.contrib.auth.mixinsimportLoginRequiredMixinclass SecretView(LoginRequiredMixin,TemplateView):template_name= 'secret.html'login_url= '/login/' # 未登录重定向 Django RESTFramework (DRF)
1. 安装与配置
pip installdjangorestframework settings.py:
INSTALLED_APPS= [ ... 'rest_framework' , ] 2. 序列化器
myapp/serializers.py:
fromrest_frameworkimportserializersfrom .modelsimport Book class BookSerializer(serializers.ModelSerializer): class Meta: model =Book fields= '__all__' 3. API视图
myapp/views.py:
fromrest_frameworkimportgenericsfrom .serializersimportBookSerializerclass BookAPIList(generics.ListCreateAPIView):queryset= Book.objects.all( )serializer_class=BookSerializerclass BookAPIDetail(generics.RetrieveUpdateDestroyAPIView):queryset= Book.objects.all( )serializer_class=BookSerializer 4. API路由
myapp/urls.py:
fromdjango.urls import path from .views importBookAPIList,BookAPIDetail urlpatterns= [ path('api/books/' ,BookAPIList.as_view( ) ) , path('api/books/<int:pk>/' ,BookAPIDetail.as_view( ) ) , ] Django 中间件
1. 自定义中间件
myapp/middleware.py:
class SimpleMiddleware: def __init__(self,get_response): self.get_response=get_responsedef __call__(self,request): # 请求处理前 print("Before view" )response= self.get_response(request) # 响应返回前 print("After view" ) returnresponse 2. 注册中间件
settings.py:
MIDDLEWARE= [ ... 'myapp.middleware.SimpleMiddleware' , ] Django 信号
1. 定义信号处理器
myapp/signals.py:
fromdjango.db.models.signalsimportpost_savefromdjango.dispatchimportreceiverfrom .modelsimport Book @receiver (post_save,sender=Book) def book_created(sender,instance,created, **kwargs): ifcreated: print(f"New book created:{instance.title }
"
) 2. 注册信号
myapp/apps.py:
fromdjango.apps importAppConfigclass MyappConfig(AppConfig):default_auto_field= 'django.db.models.BigAutoField' name = 'myapp' def ready(self): import myapp.signals# 导入信号处理器 Django 缓存
1. 视图缓存
views.py:
fromdjango.views.decorators.cache importcache_page@cache_page (60 * 15 ) # 缓存15分钟 def expensive_view(request): # 耗时操作 returnHttpResponse(... ) 2. 模板片段缓存
{% load cache %} {% cache 500 sidebar %}<!-- 缓存500秒的侧边栏内容 -->... {% endcache %} Django 国际化和本地化
1. 配置多语言
settings.py:
LANGUAGE_CODE= 'en-us'TIME_ZONE= 'UTC'USE_I18N= TrueUSE_L10N= TrueLANGUAGES= [ ('en' , 'English' ) , ('zh-hans' , '简体中文' ) , ] 2. 标记翻译文本
views.py:
fromdjango.utils.translationimportgettextas _ def greeting(request):message= _("Welcome to our site!" ) returnHttpResponse(message) 3. 模板翻译
{% load i18n %}
<h1>{% trans "Welcome to our website" %}
</h1>
<p>{% blocktrans %}Today is {{ current_date }}{% endblocktrans %}
</p> Django 安全实践
1. CSRF 保护
<!-- 表单中必须涵盖 -->{% csrf_token %} 2. XSS 防护
# 模板自动转义 { {user_input} } # 标记安全内容 fromdjango.utils.safestringimportmark_safe safe_html=mark_safe("<b>Safe content</b>" ) 3. Clickjacking 防护
settings.py:
SECURE_CONTENT_TYPE_NOSNIFF= TrueX_FRAME_OPTIONS= 'DENY'SECURE_BROWSER_XSS_FILTER= True Django 部署配置
1. 生产环境设置
settings.py:
DEBUG = FalseALLOWED_HOSTS= ['example.com']DATABASES= { 'default': { 'ENGINE': 'django.db.backends.postgresql' , 'NAME': 'mydatabase' , 'USER': 'mydbuser' , 'PASSWORD': 'mypassword' , 'HOST': 'db.example.com' , 'PORT': '5432' , } } # 静态文件配置STATIC_ROOT=BASE_DIR/ 'staticfiles'STATIC_URL= '/static/' 2. 收集静态文件
python manage.py collectstatic 3. WSGI 配置
wsgi.py:
import os fromdjango.core.wsgi importget_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE' , 'myproject.settings' )application=get_wsgi_application( ) Django 测试框架
1. 编写测试用例
tests.py:
fromdjango.test importTestCasefromdjango.urls importreversefrom .modelsimport Book class BookTests(TestCase): def setUp(self): self.book = Book.objects.create( title="Test Book" ,author="Test Author" , price=19.99 ) def test_book_listing(self): self.assertEqual(f"{ self.book.title }
"
, "Test Book" ) self.assertEqual(f"{ self.book.author}
"
, "Test Author" ) def test_book_list_view(self):response= self.client.get(reverse('book-list' ) ) self.assertEqual(response.status_code, 200 ) self.assertContains(response, "Test Book" ) 2. 运行测试
python manage.pytest Django 高级特性
1. 数据库事务
fromdjango.db importtransaction@transaction.atomic def transfer_funds(sender,receiver,amount):sender.balance-=amount sender.save( ) # 如果此处出错,整个事务回滚receiver.balance+=amount receiver.save( ) 2. 自定义模板标签
templatetags/my_tags.py:
fromdjangoimporttemplate register=template.Library( ) @register.simple_tag def current_time(format_string): fromdatetimeimportdatetimereturndatetime.now( ).strftime(format_string) 3. 异步视图
fromdjango.http importHttpResponsefromasgiref.sync importasync_to_syncasync def async_view(request): # 异步操作示例 awaitsome_async_task( ) returnHttpResponse("Async response" ) Django 第三方包集成
1. DjangoDebugToolbar
pip installdjango-debug-toolbar settings.py:
INSTALLED_APPS= [ # ... "debug_toolbar" , ]MIDDLEWARE= [ # ... "debug_toolbar.middleware.DebugToolbarMiddleware" , ]INTERNAL_IPS= ["127.0.0.1"] 2. Django Celery
# tasks.py fromceleryimportshared_task@shared_task def send_email_task(email): # 发送邮件逻辑 pass # 调用任务send_email_task.delay("user@example.com" ) Django 性能优化
1. 查询优化
# 避免N+1查询问题 books = Book.objects.select_related('author' ).all( ) # 使用prefetch_relatedauthors=Author.objects.prefetch_related('books' ).all( ) 2. 数据库索引
models.py:
class Book(models.Model): title =models.CharField(max_length=100 ,db_index=True )author=models.ForeignKey(Author,on_delete=models.CASCADE) class Meta:indexes= [models.Index(fields=['price'] , name='price_idx' ) , ] 3. 分页处理
views.py:
fromdjango.core.paginatorimportPaginatordef book_list(request):book_list= Book.objects.all( )paginator=Paginator(book_list, 25 ) # 每页25条page_number=request.GET.get('page' )page_obj=paginator.get_page(page_number) returnrender(request, 'list.html' , { 'page_obj':page_obj} ) Django 文件上传
1. 模型配置
models.py:
class Document(models.Model): title =models.CharField(max_length=100 ) file =models.FileField(upload_to='documents/' )uploaded_at=models.DateTimeField(auto_now_add=True ) 2. 表单处理
forms.py:
class DocumentForm(forms.ModelForm): class Meta: model =Document fields= ['title' , 'file'] 3. 视图处理
views.py:
def upload_file(request): ifrequest.method== 'POST': form =DocumentForm(request.POST,request.FILES) if form.is_valid( ): form.save( ) returnredirect('success' ) else: form =DocumentForm( ) returnrender(request, 'upload.html' , { 'form': form } ) Django 自定义管理命令
1. 创建命令
management/commands/import_books.py:
fromdjango.core.management.base importBaseCommandfrom myapp.modelsimport Book class Command(BaseCommand): help = 'Import books from CSV' def add_arguments(self,parser):parser.add_argument('csv_file' , type=str ) def handle(self, *args, **options): import csv with open(options['csv_file'] ) as f:reader= csv.DictReader(f) for row inreader: Book.objects.create( title=row['title'] ,author=row['author'] , price=row['price'] ) self.stdout.write(self.style.SUCCESS('Successfully imported books' ) ) 2. 运行命令
python manage.py import_books books.csv ✅ 为什么选择 Django?
- 开发速度快:脚手架工具自动化项目初始化。
- 社区强大:海量第三方包(Django Packages 官网超 5,000+ 插件)。
- 文档完善:官方教程详细,适合新手到专家所有阶段。
提示:Django 的 “约定优于配置” 理念减少了决策成本,让开发者聚焦业务逻辑。
学习资源
- 官方文档(最佳入门)
- 《Django for Beginners》书籍
- Django Girls 教程(免费实战指南)
掌握 Django 后,将能高效构建从简单博客到复杂企业级应用的全栈项目!
Python 图书推荐
| 书名 | 出版社 | 推荐 |
|---|---|---|
| Python编程 从入门到实践 第3版(图灵出品) | 人民邮电出版社 | ★★★★★ |
| Python材料科学手册(第2版)(图灵出品) | 人民邮电出版社 | ★★★★★ |
| 图形引擎开发入门:基于Python语言 | 电子工业出版社 | ★★★★★ |
| 科研论文配图绘制指南 基于Python(异步图书出品) | 人民邮电出版社 | ★★★★★ |
| Effective Python:编写好Python的90个有效方法(第2版 英文版) | 人民邮电出版社 | ★★★★★ |
| Python人工智能与机器学习(套装全5册) | 清华大学出版社 | ★★★★★ |
JAVA 图书推荐
| 书名 | 出版社 | 推荐 |
|---|---|---|
| Java核心技术 第12版:卷Ⅰ+卷Ⅱ | 机械工业出版社 | ★★★★★ |
| Java核心技术 第11版 套装共2册 | 机械工业出版社 | ★★★★★ |
| Java语言程序设计基础篇+进阶篇 原书第12版 套装共2册 | 机械工业出版社 | ★★★★★ |
| Java 11官方参考手册(第11版) | 清华大学出版社 | ★★★★★ |
| Offer来了:Java面试核心知识点精讲(第2版)(博文视点出品) | 电子工业出版社 | ★★★★★ |
浙公网安备 33010602011771号