一、Flask 基础应用案例

(一)项目搭建与初始化

  1. 环境准备
  2. 安装 Python 解释器,确保版本符合 Flask 要求,如 Python 3.6 及以上。
  3. 使用pip安装 Flask 库,命令为pip install flask
  4. 可以创建虚拟环境,如python -m venv venv,激活虚拟环境后再进行项目开发,避免依赖冲突。
  5. 项目结构规划
  6. 创建项目根目录,如my_flask_project
  7. 在根目录下创建app.py作为 Flask 应用的主入口文件。
  8. 建立templates目录用于存放 HTML 模板文件,static目录存放 CSS、JS 等静态文件。
  9. Flask 应用实例化
  10. app.py中导入 Flask 类,如from flask import Flask
  11. 创建 Flask 应用实例,app = Flask(__name__)__name__确保正确加载资源。
  12. 可设置应用的配置参数,如app.config['DEBUG'] = True开启调试模式。

(二)路由与视图函数

  1. 基本路由定义
  2. 使用@app.route('/')装饰器定义根路由,如@app.route('/') def index(): return 'Hello, World!'
  3. 可以定义带参数的路由,如@app.route('/user/<username>'),视图函数接收参数username
  4. 支持多种 HTTP 方法,如@app.route('/login', methods=['GET', 'POST']),根据方法处理不同逻辑。
  5. 视图函数逻辑处理
  6. 在视图函数中进行数据处理,如从数据库查询数据,使用数据库连接库执行 SQL 查询。
  7. 根据业务逻辑生成动态内容,如根据用户信息生成个性化问候语。
  8. 可以返回不同类型的数据,如 HTML 页面、JSON 数据等,使用render_templatejsonify函数。
  9. 路由分组与蓝图
  10. 对于复杂项目,创建蓝图来组织路由,如from flask import Blueprint; bp = Blueprint('user', __name__)
  11. 在蓝图中定义路由,如@bp.route('/profile'),然后在主应用中注册蓝图,app.register_blueprint(bp)
  12. 蓝图可使项目结构更清晰,便于维护和扩展。

(三)模板渲染

  1. Jinja2 模板引擎基础
  2. 在 HTML 模板文件中使用{{ variable }}语法输出变量,如{{ username }}
  3. 可以使用{% for %} {% endfor %}循环语句遍历数据,如{% for item in items %}{{ item }}{% endfor %}
  4. 条件判断使用{% if %} {% endif %},如{% if user.is_authenticated %}Welcome, {{ user.username }}{% endif %}
  5. 模板继承与复用
  6. 创建基础模板,如base.html,定义公共的页面结构,如头部、导航栏等。
  7. 子模板使用{% extends 'base.html' %}继承基础模板,然后使用{% block content %}{% endblock %}定义可替换的内容块。
  8. 可以在子模板中覆盖基础模板的块,实现页面的个性化定制。
  9. 模板中加载静态文件
  10. 在模板中使用{{ url_for('static', filename='css/style.css') }}引用静态文件,确保正确生成静态文件的 URL。
  11. 可以在 CSS 文件中使用相对路径引用图片等资源,如background-image: url(../images/bg.jpg);
  12. 注意静态文件路径的设置,避免出现 404 错误。

(四)表单处理

  1. HTML 表单创建
  2. 在 HTML 模板中使用<form>标签创建表单,设置action属性指定表单提交的路由,method属性为GETPOST
  3. 表单元素包括<input><textarea><select>等,如<input type="text" name="username">
  4. 可以添加表单验证属性,如required表示必填字段。
  5. Flask 接收表单数据
  6. 在视图函数中,使用request.form.get('username')获取表单提交的username数据(POST 方法)。
  7. 对于 GET 方法提交的表单,数据在request.args.get('username')中获取。
  8. 可以对获取的数据进行验证和处理,如检查数据格式是否正确。
  9. 表单数据验证与反馈
  10. 使用 Flask-WTF 扩展进行表单验证,创建表单类,定义字段和验证规则,如class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()])
  11. 在视图函数中实例化表单类,如form = LoginForm(),然后使用form.validate_on_submit()进行验证。
  12. 如果验证失败,将错误信息传递给模板,在模板中使用{{ form.username.errors }}显示错误提示。

(五)数据库集成

  1. 数据库选择与安装
  2. 常见的数据库有 MySQL、PostgreSQL、SQLite 等,根据项目需求选择。
  3. 安装相应的数据库驱动,如pip install pymysql用于 MySQL 数据库连接。
  4. 对于 SQLite,Python 内置了sqlite3模块,无需额外安装驱动。
  5. SQLAlchemy 配置与使用
  6. 安装 SQLAlchemy,pip install sqlalchemy
  7. 在 Flask 应用中配置 SQLAlchemy,如app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///test.db'
  8. 创建数据库模型类,继承db.Model,定义表结构和字段,如class User(db.Model): id = Column(Integer, primary_key=True) username = Column(String(80), unique=True, nullable=False)
  9. 数据库操作
  10. 使用db.session.add()添加数据到数据库会话,如user = User(username='test'); db.session.add(user)
  11. 使用db.session.commit()提交会话,将数据持久化到数据库。
  12. 查询数据使用User.query.filter_by(username='test').first()等方法,可进行过滤、排序等操作。

二、Django 基础应用案例

(一)项目创建与架构

  1. 项目初始化
  2. 使用django-admin startproject my_django_project命令创建 Django 项目。
  3. 进入项目目录,cd my_django_project,使用python manage.py startapp myapp创建应用。
  4. 项目目录包含manage.py管理脚本、项目配置文件settings.py等。
  5. 项目配置
  6. settings.py中配置数据库,如DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3')}}
  7. 配置静态文件路径,STATIC_URL = '/static/'STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
  8. 可以配置中间件、应用注册等其他参数。
  9. 应用架构
  10. Django 应用遵循 MVC 模式,视图函数在views.py中编写,处理业务逻辑。
  11. 模型类在models.py中定义,与数据库表对应。
  12. 模板文件放在templates目录下,由视图函数渲染。

(二)路由与视图系统

  1. URL 路由配置
  2. 在应用目录下创建urls.py文件,定义路由,如from django.urls import path; from. import views; urlpatterns = [path('', views.index, name='index')]
  3. 可以使用正则表达式匹配路由,如path('article/<int:id>/', views.article_detail, name='article_detail')
  4. 在项目根目录的urls.py中包含应用的路由,如path('myapp/', include('myapp.urls'))
  5. 视图函数编写
  6. views.py中编写视图函数,如def index(request): return HttpResponse('Hello, Django!')
  7. 视图函数接收HttpRequest对象作为参数,可获取请求信息,如request.method获取请求方法。
  8. 可以使用render函数渲染模板并返回,如return render(request, 'index.html', {'data': 'Some data'})
  9. 视图类与通用视图
  10. Django 提供视图类,如ListViewDetailView,可减少代码量。
  11. 创建视图类继承自generic.ListViewgeneric.DetailView,指定模型和模板名称等属性,如class ArticleListView(ListView): model = Article; template_name = 'article_list.html'
  12. 通用视图可快速实现常见的功能,如列表展示和详情展示。

(三)模板与模板继承

  1. Django 模板引擎
  2. 在模板文件中使用{{ variable }}输出变量,如{{ article.title }}
  3. 循环使用{% for %} {% endfor %},如{% for article in articles %}{{ article.content }}{% endfor %}
  4. 条件判断="{% if %} {% endif %}",如{% if user.is_authenticated %}Welcome, {{ user.username }}{% endif %}
  5. 模板继承与复用
  6. 创建基础模板,如base.html,定义{% block content %}{% endblock %}等内容块。
  7. 子模板继承基础模板,如{% extends 'base.html' %},然后填充内容块,如{% block content %}<h1>Article List</h1>{% endblock %}
  8. 可以在基础模板中定义公共的 CSS、JS 引用,子模板继承后自动加载。
  9. 模板标签与过滤器
  10. Django 提供丰富的模板标签,如{% csrf_token %}用于防止跨站请求伪造。
  11. 过滤器用于处理变量,如{{ article.publish_date|date:"Y-m-d" }}将日期格式化为指定格式。
  12. 可以自定义模板标签和过滤器,扩展模板功能。

(四)表单与数据验证

  1. 表单类创建
  2. 创建表单类继承自forms.Form,如class ArticleForm(forms.Form): title = forms.CharField(max_length=200) content = forms.CharField(widget=forms.Textarea)
  3. 可以在表单类中定义验证规则,如def clean_title(self): title = self.cleaned_data['title']; if 'badword' in title: raise forms.ValidationError("Title contains inappropriate word")
  4. 表单在视图中的处理
  5. 在视图函数中实例化表单类,如form = ArticleForm(request.POST or None)
  6. 使用form.is_valid()验证表单数据,如if form.is_valid(): # 处理表单数据
  7. 如果验证失败,将表单对象传递给模板,在模板中显示错误信息,如{{ form.title.errors }}
  8. 模型表单
  9. 使用模型表单可减少表单与模型之间的代码重复,创建模型表单类继承自forms.ModelForm
  10. class ArticleModelForm(forms.ModelForm): class Meta: model = Article; fields = ['title', 'content']
  11. 模型表单可方便地创建、更新和验证与模型相关的数据。

(五)数据库操作与管理

  1. 数据库模型定义
  2. models.py中定义模型类,如class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() publish_date = models.DateTimeField(auto_now_add=True)
  3. 模型类的字段对应数据库表中的列,可指定字段类型、约束等。
  4. 可以定义模型之间的关系,如ForeignKeyManyToMany等。
  5. 数据库迁移
  6. 使用python manage.py makemigrations命令生成数据库迁移文件,根据模型定义创建或修改表结构。
  7. 执行python manage.py migrate命令应用迁移,将表结构同步到数据库。
  8. 迁移文件可用于版本控制,方便在不同环境中部署数据库。
  9. 数据库查询与操作
  10. 使用模型管理器进行查询,如Article.objects.all()获取所有文章。
  11. 可进行过滤查询,如Article.objects.filter(title__contains='Python')
  12. 数据操作包括创建、更新、删除,如article = Article(title='New Article', content='Some content'); article.save()创建文章,Article.objects.filter(id=1).delete()删除文章。

三、数据库交互与优化案例

(一)SQL 查询优化

  1. 索引优化
  2. 分析查询语句,确定需要创建索引的列,如经常在WHERE子句中使用的列。
  3. 使用CREATE INDEX语句创建索引,如CREATE INDEX idx_username ON users (username)
  4. 避免创建过多索引,以免影响数据插入和更新性能。
  5. 查询语句优化
  6. 避免使用SELECT *,只获取需要的列,减少数据传输量。
  7. 合理使用JOIN语句,选择合适的连接类型,如INNER JOINLEFT JOIN等。
  8. 优化子查询,尽量将子查询转换为连接查询或使用WITH子句。
  9. 数据库引擎选择与配置
  10. 不同数据库引擎有不同特点,如 MySQL 的 InnoDB 适合事务处理,MyISAM 适合读密集型应用。
  11. 根据应用需求选择合适的引擎,并进行配置优化,如调整 InnoDB 的缓冲池大小。
  12. 定期分析数据库性能,使用数据库自带的性能分析工具或第三方工具。

(二)数据库连接池使用

  1. 连接池原理
  2. 连接池预先创建一定数量的数据库连接,并维护在一个池中。
  3. 当应用请求数据库连接时,从池中获取可用连接,使用完毕后归还到池中,避免频繁创建和关闭连接。
  4. 连接池可提高数据库连接的效率和性能,减少资源消耗。
  5. Python 连接池库选择与使用
  6. 对于 MySQL 数据库,可使用DBUtils库实现连接池,如from dbutils.pooled_db import PooledDB
  7. 配置连接池参数,如最小连接数、最大连接数、连接超时等,如pool = PooledDB(pymysql, 5, host='localhost', user='root', passwd='password', db='mydb')
  8. 从连接池中获取连接,conn = pool.connection(),使用完毕后conn.close()归还连接。
  9. 连接池性能监测与调优
  10. 监测连接池的使用情况,如连接的获取和归还次数、空闲连接数等。
  11. 根据监测结果调整连接池参数,如增加最大连接数以应对高并发,或减少最小连接数以节省资源。
  12. 注意连接池中的连接可能会因为长时间闲置而失效,需要设置连接的测试机制。

(三)数据缓存策略

  1. 缓存技术选择
  2. 内存缓存如 Redis,速度快,适合存储频繁访问的数据,如热点数据、会话数据等。
  3. 本地缓存如 Python 的functools.lru_cache,适用于函数结果的缓存,减少重复计算。
  4. 分布式缓存如 Memcached,可在多台服务器间共享缓存数据,提高缓存的可用性和扩展性。
  5. 缓存数据管理
  6. 确定缓存的数据内容和有效期,如将用户登录信息缓存 1 小时。
  7. 缓存键的设计要合理,便于快速查找和区分不同数据,如user:{user_id}:profile
  8. 缓存更新策略,当数据发生变化时,及时更新缓存或删除旧缓存数据。
  9. 缓存与数据库一致性维护
  10. 采用先更新数据库,再删除缓存的策略,减少数据不一致的风险。
  11. 可以设置缓存的过期时间,让缓存数据自动失效,然后重新从数据库获取最新数据。
  12. 对于重要数据,可增加缓存校验机制,如在读取缓存数据时,对比数据库中的版本号。

(四)数据迁移与备份

  1. 数据迁移工具与方法
  2. 使用数据库自带的迁移工具,如 MySQL 的mysqldumpmysqlimport
  3. 对于复杂的数据迁移,可使用第三方工具,如 Alembic 可用于 SQLAlchemy 模型的迁移。
  4. 在迁移过程中,注意数据类型的兼容性和数据完整性。
  5. 数据备份策略
  6. 定期全量备份数据库,如每天凌晨进行备份,保存多份历史备份数据。
  7. 增量备份,只备份自上次备份以来发生变化的数据,可减少备份时间和存储空间。
  8. 异地备份,将备份数据存储在不同地理位置的服务器或存储设备上,防止本地灾难导致数据丢失。
  9. 数据恢复测试
  10. 定期进行数据恢复测试,确保备份数据的可用性和完整性。
  11. 模拟不同的故障场景,如数据库崩溃、数据丢失等,验证恢复流程的有效性。
  12. 根据测试结果优化备份和恢复策略。

(五)数据库安全与权限管理

  1. 用户权限设置
  2. 根据不同用户角色设置不同的数据库权限,如管理员具有所有权限,普通用户只有查询和部分修改权限。
  3. 使用GRANTREVOKE语句授予和收回权限,如GRANT SELECT, INSERT ON mydb.table1 TO user1

作者:伤我者亡

物联沃分享整理
物联沃-IOTWORD物联网 » Python Web 开发案例解析

发表回复