Bootstrap

Python的秘密基地--[章节9] Python Web 开发

第9章:Python Web 开发

Python 在 Web 开发领域同样占据重要地位,凭借简洁的语法和强大的生态系统,成为了很多开发者首选的语言。本章将介绍如何使用 Python 进行 Web 开发,主要涉及 FlaskDjango 这两个流行的框架。我们还将讨论如何构建 Web API、数据库交互、以及前后端开发的协作。


9.1 Python Web 开发简介

9.1.1 Web 开发框架

在 Python 中,有多个 Web 开发框架可以选择。根据不同的应用场景,开发者可以选择不同的框架:

  • Flask:一个轻量级的微框架,适合小型项目和灵活的开发。
  • Django:一个全功能的框架,适合中大型项目,提供了更完整的功能,内建数据库支持、用户认证、管理界面等。

9.1.2 Web 开发的基本流程

  1. 路由与请求处理:定义 URL 路由和请求的处理函数。
  2. 模板渲染:根据请求渲染 HTML 页面或 JSON 数据。
  3. 数据库交互:使用数据库模型存储和查询数据。
  4. 认证与授权:实现用户注册、登录等功能。

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 小结

在本章中,我们探讨了:

  1. FlaskDjango 两个主流 Web 开发框架的特点与用法。
  2. 如何使用 Flask 构建简单的 Web 应用、进行数据库操作。
  3. 如何使用 Django 构建更复杂的 Web 应用,进行数据库迁移与交互。
  4. 构建 Web API 的方式,使用 Flask-RESTfulDjango Rest Framework
;