Flask项目搭建及部署(最全教程)
发布日期:2025-01-03 17:56 点击次数:146
flask搭建及部署
pip 19.2.3python 3.7.5Flask 1.1.1Flask-SQLAlchemy 2.4.1Pika 1.1.0Redis 3.3.11flask-wtf 0.14.2
1、创建flask项目:
创建完成后整个项目结构树:
app.py: 项⽬管理⽂件,通过它管理项⽬。
static: 存放静态文件
templates文件夹:用于放置html模板文件
由于flask属于轻量级web框架, 更加自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库 。所以这个框架的代码架构需要自己设计。
2、创建项目主要逻辑代码保存目录
手动创建application目录、filter目录及其子目录
application : 项目主要逻辑代码保存目录
_init_.py : 创建flask应用并加载配置,如mysql,redis,rabbitmq,
apps : 专门用于保存每一个项目的蓝图
app1 : app1蓝图目录,在app1下的init_.py中文件中创建蓝图对象,view.py中新增对应的视图文件,在 model.py中写模型代码
settings : 项目配置存储目录
dev.py : 项目开发阶段配置文件
prop.py : 项目生成阶段配置文件
static : 项目静态文件夹(用于存放css一类的文件)
templates : 用于放置html模板文件
filter : 整个项目拦截器目录
requestFilter.py: 针对整个app项目全局路由拦截规则定义
app.py : 项⽬管理⽂件,通过它启动整个项目
2.1 配置mysql数据库,加载配置文件并针对整个app项目定义全局db
2.1.1 settings.py
2.1.2 dev.py
2.1.3 prop.py
2.1.4 加载配置文件,定义全局的db( SQLALchemy类的实例 )供项目使用
dev : 测试环境配置
prop: 生产环境配置
Flask应用app配置加载
通常三种方式
从配置对象中加载:app.config.from_object()从配置文件中加载:app.config.from_pyfile()-ini文件从环境变量中加载:app.config.from_envvar()
配置对象
从配置对象中加载,创建配置的类:
配置文件
从配置文件中加载,在目录中定义一个配置文件config.ini
环境变量
2.2 定义model模型,负责和数据库交互
app1.model
模型 表示程序使用的持久化实体. 在Flask-SQLALchemy 中, 模型一般是一个 Python 类, 类中的属性对应数据库中的表.
db.Model :创建模型,
db.Column : 创建模型属性.
tablename :指定表名
模型属性类型 :
类型名Python类型说明Integerint普通整数,一般是 32 位SmallIntegerint取值范围小的整数,一般是 16 位Big Integerint 或 long不限制精度的整数Floatfloat浮点数Numericdecimal.Decimal定点数Stringstr变长字符串Textstr变长字符串,对较长或不限长度的字符串做了优化Unicodeunicode变长 Unicode 字符串Unicode Textunicode变长 Unicode 字符串,对较长或不限长度的字符串做了优化Booleanbool布尔值Datedatetime.date日期Timedatetime.time时间DateTimedatetime.datetime日期和时间Intervaldatetime.timedelta时间间隔Enumstr一组字符串PickleType任何 Python 对象自动使用 Pickle 序列化LargeBinarystr二进制文件
常用 SQLAlchemy 列选项
选项名说明primary_key如果设为 True,这列就是表的主键unique如果设为 True,这列不允许出现重复的值index如果设为 True,为这列创建索引,提升查询效率nullable如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值default为这列定义默认值
2.3 声明蓝图
app1._init.py
template_folder:指定模板文件路径,查找顺序,先全局templates里面找,没找到,再往子蓝图里面找.
这里是把view中所有的视图都声明在index这个蓝图里面,接下来我们需要做的是将这个声明好的蓝图,注册进我们的项目中。
2.4 将声明好的蓝图注册进app中
application.init_:
针对:app = Flask(name)解释
Flask类初始化参数
Flask类init方法部分代码
import_name:Flask程序所在的包(模块),传 __name__
static_url_path:静态文件访问路径,可以不传,默认为:/ + static_folder
static_folder:静态文件存储的文件夹,可以不传,默认为 static
template_folder:模板文件存储的文件夹,可以不传,默认为 templates
3 通过以上的步骤后,我们可以基本操作数据库了:
以下所有示例代码,皆在view.py中去实现
3.1 增:
先写怎么增,然后增加,最后提交
3.2 删:
先获取数据库中的这个数据,再删除它
3.3 改:
3.4 查:
4 路由传参
有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。
路由传递的参数默认当做 string 处理
####指定请求方式
在 Flask 中,定义一个路由,默认的请求方式为:
GETOPTIONSHEAD
在装饰器添加请求指定方式:
5 动态正则匹配路由
flask实现正则匹配步骤:
导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录自定义转换器:自定义类继承于转换器基类添加转换器到默认的转换器字典中使用自定义转换器实现自定义匹配规则
实现:
导入转换器基类
自定义转换器
添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
使用转换器去实现自定义匹配规则
当前此处定义的规则是:3位数字
自定义转换器其他函数实现
继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理:
to_python:
该函数参数中的 value 值代表匹配到的值,可输出进行查看匹配完成之后,对匹配到的参数作最后一步处理再返回,比如:转成 int 类型的值再返回:
系统自带转换器
6 增加日志记录、redis配置加载、mq配置加载
6.1 日志记录
Settings._init:
日志记录级别
application._init:
1、日志模块基础配置,如:日志存放地址、日志记录格式、日志等级
2、日志启动
6.2 redis配置及加载
之前我们在config中已经把redis的配置已经写进去了,所以这里可以直接创redis连接池供app全局使用
application._init:
使用示例:
6.3 rabbitmq基础配置及加载
使用示例:
7 全局拦截器配置
filerter.requestFilter
这里只是简单针对请求路径非index的进行拦截,如果还有其他拦截条件或者机制,可以继续在filter这个包下添加
拦截器加载进app:
8 请求对象request和返回对象Response
请求对象request,使用前先导入request模块
获取url请求参数:request.args获取form表单中的数据:request.form获取请求体原始数据:request.data获取文件数据:request.files获取cookie:request.cookies获取header信息:request.headers获取请求方法:request.method获取请求路径:request.path
Response
视图函数中可以返回的值
可以直接返回字符串,底层将这个字符串封装成了Response对象元组,响应格式(响应体,状态码,头信息),不一定都要写,底层也是封装了一个Response对象返回Response或其子类(jsonify子类返回标准json)
实现一个自定义Response对象步骤
继承Response对象实现方法 force_typeforce_type(cls,rv,environ=None)指定app.response为你定义的类如果返回的值不是可以返回的对象,就会调用force_type方法
实现
9 异常捕获及自定义异常
捕获错误
errorhandler 装饰器
注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
参数:
code_or_exception – HTTP的错误状态码或指定异常
例如统一处理状态码为500,404的错误给用户友好的提示:
例如自定义错误413
异常捕获
abort 方法
抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
参数:
code – HTTP的错误状态码
10 上下文
上下文:即语境,语意,在程序中可以理解为在代码执行到某个时刻,根据之前代码锁做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以做的事情。
Flask中有两种上下文:请求上下文(request context)和应用上下文(application context)。
Flask中上下文对象:相当于一个容器,保存了Flask程序运行过程中的一些信息。
1.application指的是当你调用app = flask(name)创建的这个对象app。 2.request指的是每次http请求发生时,WSGI server(比如gunicorn)调用Flask.call()之后,在Flask对象内部创建的Request对象; 3.application表示用于相应WSGI请求的应用本身,request表示没出http请求; 4.appliacation的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request;
请求上下文(request context):在Flask中,可以直接在视图函数中使用request这个独享进行获取先关数据,而request就是请求上下文的对象,保存了当前本次请求的相关数据,请求上线文对象有:request、session
request:封装了HTTP请求的内容,针对的是http请求。例如:user = request.args.get('user'),获取的是get请求的参数。
session:用来记录请求会话中的信息,针对的是用户信息。例如:session['name'] = user.id 科可以记录用户信息。还可以通过session.get('name')获取用户信息。
应用上下文(application context):它不是一直存在的,它只是request context中的一个对app的代理,所谓的local proxy。它的作用主要是帮助request获取当前的应用,它是伴request而生,随request而灭的。
应用上下文对象有:current_app,g
current_app:应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:
应用的启动脚本是哪个文件,启动时指定了哪些参数
加载了哪些配置文件,导入了哪些配置
连接了哪个数据库
有哪些可以调用的工具类、常量
当前flask应用在哪个机器上,哪个IP上运行,内存多大
g变量:g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
注意:不同的请求,会有不同的全局变量
两者的区别:
请求上下文:保存了客户端和服务器交互的数据
应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
11 部署
gunicorn作为服务器,安装gunicorn
pip3 install gunicorn
启动
gunicorn -w 3 -b 127.0.0.1:8000 app:app
-w 处理进程数
-b 运⾏主机ip端⼝
dpj.wsgi 项⽬的wsgi
gunicorn常⽤配置
到此这篇关于Flask项目搭建及部署(最全教程)的文章就介绍到这了,更多相关Flask项目搭建部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:Flask搭建api服务的实现步骤Python Flask搭建yolov3目标检测系统详解流程Flask搭建一个API服务器的步骤Python 利用flask搭建一个共享服务器的步骤Ubuntu下Python+Flask分分钟搭建自己的服务器教程Flask项目搭建配置项导入教程