一、Flask 基础应用案例
(一)项目搭建与初始化
环境准备
安装 Python 解释器,确保版本符合 Flask 要求,如 Python 3.6 及以上。
使用pip
安装 Flask 库,命令为pip install flask
。
可以创建虚拟环境,如python -m venv venv
,激活虚拟环境后再进行项目开发,避免依赖冲突。
项目结构规划
创建项目根目录,如my_flask_project
。
在根目录下创建app.py
作为 Flask 应用的主入口文件。
建立templates
目录用于存放 HTML 模板文件,static
目录存放 CSS、JS 等静态文件。
Flask 应用实例化
在app.py
中导入 Flask 类,如from flask import Flask
。
创建 Flask 应用实例,app = Flask(__name__)
,__name__
确保正确加载资源。
可设置应用的配置参数,如app.config['DEBUG'] = True
开启调试模式。
(二)路由与视图函数
基本路由定义
使用@app.route('/')
装饰器定义根路由,如@app.route('/') def index(): return 'Hello, World!'
。
可以定义带参数的路由,如@app.route('/user/<username>')
,视图函数接收参数username
。
支持多种 HTTP 方法,如@app.route('/login', methods=['GET', 'POST'])
,根据方法处理不同逻辑。
视图函数逻辑处理
在视图函数中进行数据处理,如从数据库查询数据,使用数据库连接库执行 SQL 查询。
根据业务逻辑生成动态内容,如根据用户信息生成个性化问候语。
可以返回不同类型的数据,如 HTML 页面、JSON 数据等,使用render_template
或jsonify
函数。
路由分组与蓝图
对于复杂项目,创建蓝图来组织路由,如from flask import Blueprint; bp = Blueprint('user', __name__)
。
在蓝图中定义路由,如@bp.route('/profile')
,然后在主应用中注册蓝图,app.register_blueprint(bp)
。
蓝图可使项目结构更清晰,便于维护和扩展。
(三)模板渲染
Jinja2 模板引擎基础
在 HTML 模板文件中使用{{ variable }}
语法输出变量,如{{ username }}
。
可以使用{% for %} {% endfor %}
循环语句遍历数据,如{% for item in items %}{{ item }}{% endfor %}
。
条件判断使用{% if %} {% endif %}
,如{% if user.is_authenticated %}Welcome, {{ user.username }}{% endif %}
。
模板继承与复用
创建基础模板,如base.html
,定义公共的页面结构,如头部、导航栏等。
子模板使用{% extends 'base.html' %}
继承基础模板,然后使用{% block content %}{% endblock %}
定义可替换的内容块。
可以在子模板中覆盖基础模板的块,实现页面的个性化定制。
模板中加载静态文件
在模板中使用{{ url_for('static', filename='css/style.css') }}
引用静态文件,确保正确生成静态文件的 URL。
可以在 CSS 文件中使用相对路径引用图片等资源,如background-image: url(../images/bg.jpg);
。
注意静态文件路径的设置,避免出现 404 错误。
(四)表单处理
HTML 表单创建
在 HTML 模板中使用<form>
标签创建表单,设置action
属性指定表单提交的路由,method
属性为GET
或POST
。
表单元素包括<input>
、<textarea>
、<select>
等,如<input type="text" name="username">
。
可以添加表单验证属性,如required
表示必填字段。
Flask 接收表单数据
在视图函数中,使用request.form.get('username')
获取表单提交的username
数据(POST 方法)。
对于 GET 方法提交的表单,数据在request.args.get('username')
中获取。
可以对获取的数据进行验证和处理,如检查数据格式是否正确。
表单数据验证与反馈
使用 Flask-WTF 扩展进行表单验证,创建表单类,定义字段和验证规则,如class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()])
。
在视图函数中实例化表单类,如form = LoginForm()
,然后使用form.validate_on_submit()
进行验证。
如果验证失败,将错误信息传递给模板,在模板中使用{{ form.username.errors }}
显示错误提示。
(五)数据库集成
数据库选择与安装
常见的数据库有 MySQL、PostgreSQL、SQLite 等,根据项目需求选择。
安装相应的数据库驱动,如pip install pymysql
用于 MySQL 数据库连接。
对于 SQLite,Python 内置了sqlite3
模块,无需额外安装驱动。
SQLAlchemy 配置与使用
安装 SQLAlchemy,pip install sqlalchemy
。
在 Flask 应用中配置 SQLAlchemy,如app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///test.db'
。
创建数据库模型类,继承db.Model
,定义表结构和字段,如class User(db.Model): id = Column(Integer, primary_key=True) username = Column(String(80), unique=True, nullable=False)
。
数据库操作
使用db.session.add()
添加数据到数据库会话,如user = User(username='test'); db.session.add(user)
。
使用db.session.commit()
提交会话,将数据持久化到数据库。
查询数据使用User.query.filter_by(username='test').first()
等方法,可进行过滤、排序等操作。
二、Django 基础应用案例
(一)项目创建与架构
项目初始化
使用django-admin startproject my_django_project
命令创建 Django 项目。
进入项目目录,cd my_django_project
,使用python manage.py startapp myapp
创建应用。
项目目录包含manage.py
管理脚本、项目配置文件settings.py
等。
项目配置
在settings.py
中配置数据库,如DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3')}}
。
配置静态文件路径,STATIC_URL = '/static/'
,STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
。
可以配置中间件、应用注册等其他参数。
应用架构
Django 应用遵循 MVC 模式,视图函数在views.py
中编写,处理业务逻辑。
模型类在models.py
中定义,与数据库表对应。
模板文件放在templates
目录下,由视图函数渲染。
(二)路由与视图系统
URL 路由配置
在应用目录下创建urls.py
文件,定义路由,如from django.urls import path; from. import views; urlpatterns = [path('', views.index, name='index')]
。
可以使用正则表达式匹配路由,如path('article/<int:id>/', views.article_detail, name='article_detail')
。
在项目根目录的urls.py
中包含应用的路由,如path('myapp/', include('myapp.urls'))
。
视图函数编写
在views.py
中编写视图函数,如def index(request): return HttpResponse('Hello, Django!')
。
视图函数接收HttpRequest
对象作为参数,可获取请求信息,如request.method
获取请求方法。
可以使用render
函数渲染模板并返回,如return render(request, 'index.html', {'data': 'Some data'})
。
视图类与通用视图
Django 提供视图类,如ListView
和DetailView
,可减少代码量。
创建视图类继承自generic.ListView
或generic.DetailView
,指定模型和模板名称等属性,如class ArticleListView(ListView): model = Article; template_name = 'article_list.html'
。
通用视图可快速实现常见的功能,如列表展示和详情展示。
(三)模板与模板继承
Django 模板引擎
在模板文件中使用{{ variable }}
输出变量,如{{ article.title }}
。
循环使用{% for %} {% endfor %}
,如{% for article in articles %}{{ article.content }}{% endfor %}
。
条件判断="{% if %} {% endif %}"
,如{% if user.is_authenticated %}Welcome, {{ user.username }}{% endif %}
。
模板继承与复用
创建基础模板,如base.html
,定义{% block content %}{% endblock %}
等内容块。
子模板继承基础模板,如{% extends 'base.html' %}
,然后填充内容块,如{% block content %}<h1>Article List</h1>{% endblock %}
。
可以在基础模板中定义公共的 CSS、JS 引用,子模板继承后自动加载。
模板标签与过滤器
Django 提供丰富的模板标签,如{% csrf_token %}
用于防止跨站请求伪造。
过滤器用于处理变量,如{{ article.publish_date|date:"Y-m-d" }}
将日期格式化为指定格式。
可以自定义模板标签和过滤器,扩展模板功能。
(四)表单与数据验证
表单类创建
创建表单类继承自forms.Form
,如class ArticleForm(forms.Form): title = forms.CharField(max_length=200) content = forms.CharField(widget=forms.Textarea)
。
可以在表单类中定义验证规则,如def clean_title(self): title = self.cleaned_data['title']; if 'badword' in title: raise forms.ValidationError("Title contains inappropriate word")
。
表单在视图中的处理
在视图函数中实例化表单类,如form = ArticleForm(request.POST or None)
。
使用form.is_valid()
验证表单数据,如if form.is_valid(): # 处理表单数据
。
如果验证失败,将表单对象传递给模板,在模板中显示错误信息,如{{ form.title.errors }}
。
模型表单
使用模型表单可减少表单与模型之间的代码重复,创建模型表单类继承自forms.ModelForm
。
如class ArticleModelForm(forms.ModelForm): class Meta: model = Article; fields = ['title', 'content']
。
模型表单可方便地创建、更新和验证与模型相关的数据。
(五)数据库操作与管理
数据库模型定义
在models.py
中定义模型类,如class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() publish_date = models.DateTimeField(auto_now_add=True)
。
模型类的字段对应数据库表中的列,可指定字段类型、约束等。
可以定义模型之间的关系,如ForeignKey
、ManyToMany
等。
数据库迁移
使用python manage.py makemigrations
命令生成数据库迁移文件,根据模型定义创建或修改表结构。
执行python manage.py migrate
命令应用迁移,将表结构同步到数据库。
迁移文件可用于版本控制,方便在不同环境中部署数据库。
数据库查询与操作
使用模型管理器进行查询,如Article.objects.all()
获取所有文章。
可进行过滤查询,如Article.objects.filter(title__contains='Python')
。
数据操作包括创建、更新、删除,如article = Article(title='New Article', content='Some content'); article.save()
创建文章,Article.objects.filter(id=1).delete()
删除文章。
三、数据库交互与优化案例
(一)SQL 查询优化
索引优化
分析查询语句,确定需要创建索引的列,如经常在WHERE
子句中使用的列。
使用CREATE INDEX
语句创建索引,如CREATE INDEX idx_username ON users (username)
。
避免创建过多索引,以免影响数据插入和更新性能。
查询语句优化
避免使用SELECT *
,只获取需要的列,减少数据传输量。
合理使用JOIN
语句,选择合适的连接类型,如INNER JOIN
、LEFT JOIN
等。
优化子查询,尽量将子查询转换为连接查询或使用WITH
子句。
数据库引擎选择与配置
不同数据库引擎有不同特点,如 MySQL 的 InnoDB 适合事务处理,MyISAM 适合读密集型应用。
根据应用需求选择合适的引擎,并进行配置优化,如调整 InnoDB 的缓冲池大小。
定期分析数据库性能,使用数据库自带的性能分析工具或第三方工具。
(二)数据库连接池使用
连接池原理
连接池预先创建一定数量的数据库连接,并维护在一个池中。
当应用请求数据库连接时,从池中获取可用连接,使用完毕后归还到池中,避免频繁创建和关闭连接。
连接池可提高数据库连接的效率和性能,减少资源消耗。
Python 连接池库选择与使用
对于 MySQL 数据库,可使用DBUtils
库实现连接池,如from dbutils.pooled_db import PooledDB
。
配置连接池参数,如最小连接数、最大连接数、连接超时等,如pool = PooledDB(pymysql, 5, host='localhost', user='root', passwd='password', db='mydb')
。
从连接池中获取连接,conn = pool.connection()
,使用完毕后conn.close()
归还连接。
连接池性能监测与调优
监测连接池的使用情况,如连接的获取和归还次数、空闲连接数等。
根据监测结果调整连接池参数,如增加最大连接数以应对高并发,或减少最小连接数以节省资源。
注意连接池中的连接可能会因为长时间闲置而失效,需要设置连接的测试机制。
(三)数据缓存策略
缓存技术选择
内存缓存如 Redis,速度快,适合存储频繁访问的数据,如热点数据、会话数据等。
本地缓存如 Python 的functools.lru_cache
,适用于函数结果的缓存,减少重复计算。
分布式缓存如 Memcached,可在多台服务器间共享缓存数据,提高缓存的可用性和扩展性。
缓存数据管理
确定缓存的数据内容和有效期,如将用户登录信息缓存 1 小时。
缓存键的设计要合理,便于快速查找和区分不同数据,如user:{user_id}:profile
。
缓存更新策略,当数据发生变化时,及时更新缓存或删除旧缓存数据。
缓存与数据库一致性维护
采用先更新数据库,再删除缓存的策略,减少数据不一致的风险。
可以设置缓存的过期时间,让缓存数据自动失效,然后重新从数据库获取最新数据。
对于重要数据,可增加缓存校验机制,如在读取缓存数据时,对比数据库中的版本号。
(四)数据迁移与备份
数据迁移工具与方法
使用数据库自带的迁移工具,如 MySQL 的mysqldump
和mysqlimport
。
对于复杂的数据迁移,可使用第三方工具,如 Alembic 可用于 SQLAlchemy 模型的迁移。
在迁移过程中,注意数据类型的兼容性和数据完整性。
数据备份策略
定期全量备份数据库,如每天凌晨进行备份,保存多份历史备份数据。
增量备份,只备份自上次备份以来发生变化的数据,可减少备份时间和存储空间。
异地备份,将备份数据存储在不同地理位置的服务器或存储设备上,防止本地灾难导致数据丢失。
数据恢复测试
定期进行数据恢复测试,确保备份数据的可用性和完整性。
模拟不同的故障场景,如数据库崩溃、数据丢失等,验证恢复流程的有效性。
根据测试结果优化备份和恢复策略。
(五)数据库安全与权限管理
用户权限设置
根据不同用户角色设置不同的数据库权限,如管理员具有所有权限,普通用户只有查询和部分修改权限。
使用GRANT
和REVOKE
语句授予和收回权限,如GRANT SELECT, INSERT ON mydb.table1 TO user1
。
点赞
打赏