一步一步FLASK(一)
简介:#
本文是记录本人建立一个flask项目的完整过程。
涉及FLASK的诸多实用技术。
一:基本FLASK#
pycharm建立FLASK项目即可运行。
代码如下:

from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'hello' if __name__ == '__main__': app.run()
直接运行即可。pycharm的默认访问地址是http://127.0.0.1:5000/
修改默认的app.py为main.py,即主入口文件
二:引入bootstrap#
前端想少写东西,就要有前端框架,bootstrap是一个流行的框架,原有的flask-bootstrap停止更新了,改用一个继承者Bootstrap-Flask
1.手动安装扩展Bootstrap-Flask#
pip install Bootstrap-Flask
2.创建html模板#
在templates目录下创建目录base,在base目录下创建base.html

<!doctype html> <html lang="en"> <head> {% block head %} <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> {% block styles %} <!-- Bootstrap CSS --> {{ bootstrap.load_css() }} {% endblock %} <title>Your page title</title> {% endblock %} </head> <body> <!-- Your page content --> {% block content %}{% endblock %} {% block scripts %} <!-- Optional JavaScript --> {{ bootstrap.load_js() }} {% endblock %} </body> </html>
这个代码是bootstrap-flask推荐的。
3.修改app.py#

from flask_bootstrap import Bootstrap from flask import Flask, render_template #添加渲染模板的库 app = Flask(__name__) bootstrap = Bootstrap(app) @app.route('/') def hello_world(): return render_template('base/base.html') #修改返回为渲染模板 if __name__ == '__main__': app.run()
运行访问,虽然是个空页面,但是查看源码,会看到多了加载CSS和JS
4.可选(配置本地加载CSS和JS)#

from flask_bootstrap import Bootstrap from flask import Flask, render_template app = Flask(__name__) bootstrap = Bootstrap(app) app.config['BOOTSTRAP_SERVE_LOCAL'] = True #配置flask-bootstrap加载本地数据 @app.route('/') def hello_world(): return render_template('base/base.html') if __name__ == '__main__': app.run()
由原来的cdn加速地址改为本地了。
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css" type="text/css">
<link rel="stylesheet" href="/bootstrap/static/css/bootstrap.min.css" type="text/css">
三:创建requirements.txt#
1.为了项目复制以及部署,需要对第三方库进行管理。
在项目根目录创建文件make_requirement.py

import os, sys, platform # 找到当前目录 project_root = os.path.dirname(os.path.realpath(__file__)) print(project_root) #不同的系统,使用不同的命令语句 if platform.system() == 'Linux': command = sys.executable + ' -m pip freeze > ' + project_root + '/requirements.txt' if platform.system() == 'Windows': command = '"' + sys.exec_prefix + '\Scripts\pip" freeze > ' + project_root + '\\requirements.txt' # # 拼接生成requirements命令 print(command) # # # 执行命令。 os.system(command)
运行后即可在项目根目录生成requirements.txt
四:加入蓝图Blueprint#
1.根据蓝图结构创建目录和文件#
如下:

D:. │ main.py │ make_requirement.py │ requirements.txt │ ├─app │ └─users │ view.py #新建视图文件 │ ├─static ├─templates │ └─base │ base.html │ └─__pycache__ main.cpython-37.pyc
2.编辑视图文件#
编辑/app/users/view.py

from flask import Blueprint user = Blueprint('user', __name__) @user.route('/') def show(): return 'user.default' @user.route('/register') def register(): return 'user.register' @user.route('/login') def login(): return 'user.login' @user.route('/logout') def logout(): return 'user.logout'
3.注册蓝图到主入口#
编辑main.py

from flask_bootstrap import Bootstrap from flask import Flask, render_template from app.users.view import user #引入视图 app = Flask(__name__) bootstrap = Bootstrap(app) app.config['BOOTSTRAP_SERVE_LOCAL'] = True app.register_blueprint(user, url_prefix='/user') #注册视图 if __name__ == '__main__': app.run()
4.测试访问#
http://127.0.0.1:5000/user/
http://127.0.0.1:5000/user/register
http://127.0.0.1:5000/user/login
http://127.0.0.1:5000/user/logout
都可以访问
五:引入数据库sqlalchemy alembic MySQL-connector-python#
1.手动安装扩展#
pip install sqlalchemy alembic MySQL-connector-python
2.创建配置文件#
创建config.py

from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base engine = create_engine('mysql+mysqlconnector://zzcld:zzcld@mariadb/zzcld', convert_unicode=True) db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) Base = declarative_base() Base.query = db_session.query_property()
3.修改flask默认配置方法#
把main.py中定义的配置,放进config.py
修改config.py

from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base class Config(object): #配置这项 DEBUG = False TESTING = False DATABASE_URI = 'mysql+mysqlconnector://zzcld:zzcld@mariadb/zzcld' BOOTSTRAP_SERVE_LOCAL = True engine = create_engine(Config.DATABASE_URI, convert_unicode=True) #修改数据库路径 db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) Base = declarative_base() Base.query = db_session.query_property()
4.使用alembic#
https://www.cnblogs.com/jackadam/p/8684633.html#_label4
5.创建用户model#
创建/app/users/model.py

from config import Base from sqlalchemy import Column, Integer, String, Boolean class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(50)) #用户名 password = Column(String(120)) #密码 activity = Column(Boolean) #是否活动/禁用
6.配置alembic#
需要修改配置的有两个文件。
alembic.ini,其中配置数据库连接参数。
修改这行:
sqlalchemy.url = driver://user:pass@localhost/dbname
改为我们的数据连接参数:
sqlalchemy.url = mysql+mysqlconnector://zzcld:zzcld@mariadb/zzcld
env.py,其中配置models。
修改这行:
target_metadata = None
修改为:

import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../") from app.users import model target_metadata = model.Base.metadata
7.使用alembic,更新数据库#
alembic revision --autogenerate 生成alembic升级脚本
alembic upgrade head 升级数据库结构到最新版
执行这两个命令,或用扩展工具的图形菜单。
8.检查数据库#
使用第三方工具,连接你的数据库查看数据库建立情况。
六:引入表单,处理注册登录Flask-wtf#
这个是一个表单库,基于wtform。处理各种表单,先处理注册和登录。
1.安装第三方库flask-wtf#
pip install flask-wtf
2.创建表单#
修改user/register,既/app/users/view.py

class register_form(FlaskForm): #注册表单 username = StringField('用户名', validators=[DataRequired()]) password = StringField('密码', validators=[DataRequired()]) class login_form(FlaskForm): #登录表单 username = StringField('用户名', validators=[DataRequired()]) password = StringField('密码', validators=[DataRequired()])
3.创建模板#
创建/templates/users/register.html
创建/templates/users/login.html
内容一样

{% extends 'base/base.html' %} {% block content %} <form method="POST" action="#"> {{ form.csrf_token }} {{ form.username.label }} {{ form.username(size=20) }} <br> {{ form.password.label }} {{ form.password(size=20) }} <br> <input type="submit" value="提交"> </form> {% endblock %}
4.渲染表单#
修改/app/users/view.py

@user.route('/register', methods=('GET', 'POST')) def register(): form = register_form() # 初始化表单 return render_template('users/register.html', form=form) @user.route('/login', methods=('GET', 'POST')) def login(): form = login_form() # 初始化表单 return render_template('users/login.html', form=form)
5.尝试访问#
http://127.0.0.1:5000/user/register
http://127.0.0.1:5000/user/login
已经有了一个表单,有用户名和密码两个框,一个提交按钮。
6.处理业务逻辑#
修改/app/users/view.py

@user.route('/register', methods=('GET', 'POST')) def register(): form = register_form() # 初始化表单 if form.validate_on_submit(): # 如果页面有提交数据,在此创建数据库条目 new_user = Users(username=form.username.data, password=form.password.data, activity=True) db_session.add(new_user) db_session.commit() db_session.close() return redirect(url_for('user.login')) # 跳转到登录页面 return render_template('users/register.html', form=form) @user.route('/login', methods=('GET', 'POST')) def login(): form = login_form() # 初始化表单 if form.validate_on_submit(): # 如果页面有提交数据,在此创建数据库条目 login_user = db_session.query(Users).filter_by(username=form.username.data).first() # 查找name=jack的 print(login_user.username) print(form.password.data) if login_user.password==form.password.data: return redirect(url_for('user.show')) # else: return '登录失败' return render_template('users/login.html', form=form)
7.尝试注册和登录#
我测试正常
七:登录后的验证flask-session#
为防止cookie伪造,我使用session来保存用户信息。
1.手动安装第三方库#
pip install flask-session
2.配置并注入flask-session#
修改main.py

from flask_bootstrap import Bootstrap from flask import Flask, render_template from app.users.view import user # 引入视图 from config import Config from flask_session import Session app = Flask(__name__) app.config.from_object(Config) #不知道为什么,注入Session之前要先加载配置 Session(app) #新加 bootstrap = Bootstrap(app) app.register_blueprint(user, url_prefix='/user') @app.route('/') def default(): return render_template('base/base.html') if __name__ == '__main__': app.run()
修改config.py

class Config(object): # 配置这项 DEBUG = False TESTING = False DATABASE_URI = 'mysql+mysqlconnector://zzcld:zzcld@mariadb/zzcld' BOOTSTRAP_SERVE_LOCAL = True SECRET_KEY = os.urandom(24) # 加密的密码,部署时修改,测试时使用随机字符串 SESSION_TYPE = 'filesystem' # session存储类型,暂时使用文件存储,部署时会改用redis SESSION_PERMANENT = False # 是否永久生效,false就是关闭浏览器失效 SESSION_USE_SIGNER = True #是否签名会话cookie sid 避免伪造,签名 SESSION_FILE_THRESHOLD = 2 #保存session条数,既最大同时登录人数,默认500,部署时修改
3.处理业务逻辑#
登录时,设置session,登出时,清空session,用户默认页,读取session。
修改/app/users/view.py

@user.route('/') def show(): return (session.get('key', 'not set')+'设置'+session.get('user', 'not set')) @user.route('/login', methods=('GET', 'POST')) def login(): form = login_form() # 初始化表单 if form.validate_on_submit(): # 如果页面有提交数据,在此创建数据库条目 login_user = db_session.query(Users).filter_by(username=form.username.data).first() # 查找name=jack的 print(login_user.username) print(form.password.data) if login_user.password==form.password.data: session['key'] = 'value' session['user'] = 'user' return redirect(url_for('user.show')) # else: return '登录失败' return render_template('users/login.html', form=form) @user.route('/logout') def logout(): session.clear() return 'user.logout'
4.访问测试#
http://127.0.0.1:5000/user/ 登录前和登录后,显示的不一样。
http://127.0.0.1:5000/user/login
http://127.0.0.1:5000/user/logout
八:释放数据库连接#
我是经常忘记释放数据库连接,这不是一个好习惯,好在flask有内置的装饰器可以在在请求结束时或在应用程序关闭时自动删除数据库会话:
1.编辑main.py#

from flask_bootstrap import Bootstrap from flask import Flask, render_template from app.users.view import user from config import Config from config import db_session #引入session from flask_session import Session app = Flask(__name__) app.config.from_object(Config) Session(app) bootstrap = Bootstrap(app) app.register_blueprint(user, url_prefix='/user') @app.teardown_appcontext #新加 def shutdown_session(exception=None): db_session.remove() @app.route('/') def default(): return render_template('base/base.html') if __name__ == '__main__': app.run()
九:#
1.#
2.#
3.#
4.#
5.#
6.#
7.#
8.#
9.#
十:#
1.#
2.#
3.#
4.#
5.#
6.#
7.#
8.#
9.#
作者:上官飞鸿
出处:https://www.cnblogs.com/jackadam/p/11867000.html
版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!