第9章:Python Web 开发
Python 在 Web 开发领域同样占据重要地位,凭借简洁的语法和强大的生态系统,成为了很多开发者首选的语言。本章将介绍如何使用 Python 进行 Web 开发,主要涉及 Flask 和 Django 这两个流行的框架。我们还将讨论如何构建 Web API、数据库交互、以及前后端开发的协作。
9.1 Python Web 开发简介
9.1.1 Web 开发框架
在 Python 中,有多个 Web 开发框架可以选择。根据不同的应用场景,开发者可以选择不同的框架:
- Flask:一个轻量级的微框架,适合小型项目和灵活的开发。
- Django:一个全功能的框架,适合中大型项目,提供了更完整的功能,内建数据库支持、用户认证、管理界面等。
9.1.2 Web 开发的基本流程
- 路由与请求处理:定义 URL 路由和请求的处理函数。
- 模板渲染:根据请求渲染 HTML 页面或 JSON 数据。
- 数据库交互:使用数据库模型存储和查询数据。
- 认证与授权:实现用户注册、登录等功能。
9.2 使用 Flask 构建 Web 应用
9.2.1 Flask 简介
Flask 是一个轻量级的 Web 框架,适合快速开发和原型构建。它提供了最基本的功能,灵活度高,开发者可以根据需要集成扩展模块。
9.2.2 Flask 基本项目结构
一个典型的 Flask 项目结构如下:
/myapp
/app
__init__.py # 应用初始化
routes.py # 路由定义
templates/ # HTML 模板
static/ # 静态文件(如 CSS, JS)
run.py # 启动脚本
9.2.3 创建一个简单的 Flask 应用
# run.py
from app import create_app
app = create_app()
if __name__ == "__main__":
app.run(debug=True)
# app/__init__.py
from flask import Flask
def create_app():
app = Flask(__name__)
# 注册蓝图和路由
from .routes import main
app.register_blueprint(main)
return app
# app/routes.py
from flask import Blueprint, render_template
main = Blueprint('main', __name__)
@main.route('/')
def home():
return render_template('index.html')
<!-- app/templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask Web 应用</title>
</head>
<body>
<h1>欢迎来到 Flask Web 应用!</h1>
</body>
</html>
运行该项目,访问 http://localhost:5000
即可看到简单的欢迎页面。
9.2.4 Flask 与数据库交互
Flask 与数据库交互通常使用 SQLAlchemy,它是一个 ORM(对象关系映射)工具,可以将数据库表映射为 Python 类,便于进行数据操作。
pip install flask-sqlalchemy
# app/__init__.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db.init_app(app)
from .routes import main
app.register_blueprint(main)
return app
# app/models.py
from datetime import datetime
from . import db
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
date_posted = db.Column(db.DateTime, default=datetime.utcnow)
# app/routes.py
from flask import render_template
from . import main
from .models import Post
@main.route('/')
def home():
posts = Post.query.all() # 获取所有帖子
return render_template('index.html', posts=posts)
9.3 使用 Django 构建 Web 应用
9.3.1 Django 简介
Django 是一个全栈 Web 框架,提供了很多现成的功能,包括用户认证、管理后台、数据库迁移等。适合中大型项目,内建的数据库 ORM 使得与数据库的交互非常方便。
9.3.2 Django 项目结构
一个典型的 Django 项目结构如下:
/myproject
/myapp
__init__.py
models.py
views.py
urls.py
/templates
/static
manage.py
9.3.3 创建 Django 应用
django-admin startproject myproject
cd myproject
django-admin startapp myapp
# myproject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
# myapp/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
# 迁移数据库
python manage.py makemigrations
python manage.py migrate
# myapp/views.py
from django.shortcuts import render
from .models import Post
def home(request):
posts = Post.objects.all() # 获取所有帖子
return render(request, 'home.html', {'posts': posts})
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
]
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
<!-- templates/home.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Django Web 应用</title>
</head>
<body>
<h1>欢迎来到 Django Web 应用!</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }} - {{ post.date_posted }}</li>
{% endfor %}
</ul>
</body>
</html>
运行该项目,访问 http://127.0.0.1:8000
即可查看显示的帖子列表。
9.4 构建 Web API
Web API 是客户端和服务器端进行通信的常见方式。Python 提供了 Flask-RESTful
和 Django Rest Framework (DRF) 来简化 API 的构建。
9.4.1 使用 Flask-RESTful 构建 API
pip install flask-restful
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
访问 http://localhost:5000/
将返回:
{
"message": "Hello, World!"
}
9.4.2 使用 Django Rest Framework 构建 API
pip install djangorestframework
# myapp/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloWorld(APIView):
def get(self, request):
return Response({'message': 'Hello, World!'})
# myapp/urls.py
from django.urls import path
from .views import HelloWorld
urlpatterns = [
path('api/', HelloWorld.as_view(), name='api-home'),
]
9.5 小结
在本章中,我们探讨了:
- Flask 和 Django 两个主流 Web 开发框架的特点与用法。
- 如何使用 Flask 构建简单的 Web 应用、进行数据库操作。
- 如何使用 Django 构建更复杂的 Web 应用,进行数据库迁移与交互。
- 构建 Web API 的方式,使用 Flask-RESTful 和 Django Rest Framework