Flask 框架
一、 简介
1、 框架介绍
Flask是一个基于Python并且依赖于Jinja2模板引擎和Werkzeug WSGI 服务的一个微型框架
WSGI :Web Server Gateway Interface(WEB服务网关接口),定义了使用python编写的web app与web server之间接口格式
其他类型框架:
-
Django
:比较“重”的框架,同时也是最出名的Python框架。包含了web开发中常用的功能、组件的框架(ORM、Session、Form、Admin、分页、中间件、信号、缓存、ContenType…),Django是走大而全的方向,最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。 -
Tornado
:大特性就是异步非阻塞、原生支持WebSocket协议; -
Flask
: 一个轻量级的基于 Python 的 Web 框架 -
Bottle
:是一个简单高效的遵循WSGI的微型python Web框架。说微型,是因为它只有一个文件,除Python标准库外,它不依赖于任何第三方模块。
2、 架构模式
Flask的架构模式-MTV
- 经典三层结构 :MVC模式
- M :Models ,模型层,负责数据库建模
- V :Views,视图层,用于处理用户显示的内容,如 :html
- C :Controller,控制器,处理与用户交互的部分内容。处理用户的请求并给出响应
- python常用:MTV模式
- M :Models ,模型层,负责数据库建模
- T :Templates ,模板层,用于处理用户显示的内容,如:html
- V :Views ,视图层,处理与用户交互的部分内容。处理用户的请求并给出响应
3、 环境搭建
-
安装
pip install flask
-
创建工作目录
mkdir first_dir # 创建工作目录 mkdir first_dir/static # 创建存放图片、css等不需要动态生成的静态文件 mkdir first_dir/templates # 创建存放响应文本的模板文件夹 touch first_dir/app.py # 主程序
-
在
app.py
中添加from flask import Flask app = Flask(__name__) @app.route('/') # Flask路由 def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() # 运行网站
主程序会默认访问
templates
和static
文件夹,如果,存放web文件的文件夹名称不是这两个,那么要在实例化Flask
路由时,声明
flask中文网:https://flask.net.cn/
如果对一些语法有疑问,可以自行访问官网去查看
二、 第一个应用
主程序代码
from flask import (Flask, render_template
, request, redirect, session)
app = Flask(__name__) # 创建一个服务器
app.secret_key = "ashdjhfcasjcvbgjs" # 设置盐,对session信息进行加密,随机字符串
app.debug = True # 当文件保存时,flask服务就重启
USER_DICT = {
"1": {
"name": "李华", "age": 12},
"2": {
"name": "李虎", "age": 13},
} # 假设这个为用户数据,其为从数据库中读取出来的
@app.route('/login', methods=["GET", "POST"])
def hello_world():
if request.method == "GET": # 如果请求方式为get请求
return render_template("login.html") # 对静态文件中的文件进行渲染
user = request.form.get("user") # 得到表单数据
pwd = request.form.get("pwd")
if user == "kun" and pwd == "123": # 进行判断
# 用户信息放入session中,默认放入浏览器的cookie中
session["user_info"] = user
return redirect("/index") # 进行重定向
return render_template("login.html", msg="账号或密码错误,登录失败") # 如果登录失败,将失败信息传入前端页面中
@app.route("/detail")
def detail():
user_info = session.get("user_info")
if not user_info: # 判断是否登录
return redirect("/login") # 如果没有登录,重定向到登录界面
uid = request.args.get("uid") # 获取传入的参数
info = USER_DICT.get(uid) # 获取人员信息
return render_template("detail.html", info=info) # 进行页面的渲染
@app.route("/index")
def index():
user_info = session.get("user_info")
if not user_info: # 如果没有用户信息,则返回登录页面
return redirect("/login")
return render_template("index.html", user_dict=USER_DICT)
@app.route("/loginout")
def loginout():
del session["user_info"] # 删除cookies信息,进行注销操作
return redirect("/login") # 重定向到登录页面
@app.route("/")
def red(): # 如果直接访问的话,默认跳转到登录界面
return redirect("/index") # 进行url的跳转
if __name__ == '__main__':
app.run()
代码详情在:【https://github.com/liuzhongkun1/flask_/tree/main/firstFlask】
三、 框架语法
参考文档:【https://www.cnblogs.com/wupeiqi/asticles/7552008.html】
1、 框架之配置
# flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:
{
'DEBUG': get_debug_flag(default=False), # 是否开启Debug模式
'TESTING': False, # 是否开启测试模式
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'USE_X_SENDFILE': False,
'LOGGER_NAME': None,
'LOGGER_HANDLER_POLICY': 'always',
'SERVER_NAME': None,
'APPLICATION_ROOT': None,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
}
# 方式一:
app.config['DEBUG'] = True # PS: 由于Config对象本质上是字典,所以还可以使用app.config.update(...)
# 方式二:
app.config.from_pyfile("python文件名称")
"""
如:
settings.py
DEBUG = True
app.config.from_pyfile("settings.py")
"""
app.config.from_envvar("环境变量名称") # 环境变量的值为python文件名称名称,内部调用from_pyfile方法
app.config.from_json("json文件名称") # JSON文件名称,必须是json格式,因为内部会执行json.loads
app.config.from_mapping({
'DEBUG':True}) # 字典格式
app.config.from_object("python类或类的路径") # 传入一个类
"""
如:
app.config.from_object('pro_flask.settings.TestingConfig')
settings.py
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:'
class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo'
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
PS: 从sys.path中已经存在路径开始写
PS: settings.py文件默认路径要放在程序root_path目录,如果instance_relative_config为True,则就是instance_path目录
"""
具体的配置参数请通过官方文档获取
2、 框架之路由
2.1 添加路由
# 第一种
@app.route('/')
def hello_world():
return 'Hello World!'
# 第二种
def index():
return "index"
app.add_url_rule("/index", None, index)
2.2 反向生成
from flask import Flask, url_for, redirect
app = Flask(__name__)