1 Flask介绍
# 介绍
Flask是一个基于Python开发,并且依赖jinja2模板(DTL)和Werkzeug(wsgiref) WSGI服务的一个微型web框架。
对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,
然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,
并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,
即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器
# flask项目的所有代码都可以写在一个py文件中(一般不用),也可以按照不同拆分 (可扩展性高)
# 通过集成很多第三方插件实现跟django一样的功能
# wsgiref
2 快速使用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index(): # 也不需要request 参数
return 'hello flask' # 返回字符串即可,flask自动包装成 Httpresponse对象
if __name__ == '__main__':
app.run() # 启动flask项目
2.1 Flask类的参数详解
### 必填参数:
import_name = __name__ # 接收包或者模块的名字作为参数,但一般都是传递__name__
### 常用参数:
static_folder = 'static', # 静态文件目录的路径 默认当前项目中的static目录
static_url_path = None, # 静态文件目录的url路径 默认不写是与static_folder同名,远程静态文件时复用
template_folder = 'templates' # template模板目录, 默认当前项目中的 templates 目录
### 不常用参数:
static_host = None, # 远程静态文件所用的Host地址,默认为空
# host_matching是否开启host主机位匹配,是要与static_host一起使用,如果配置了static_host, 则必须赋值为True
# 这里要说明一下,@app.route("/",host="localhost:5000") 就必须要这样写
# host="localhost:5000" 如果主机头不是 localhost:5000 则无法通过当前的路由
host_matching = False, # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数
subdomain_matching = False, # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里
instance_path = None, # 指向另一个Flask实例的路径 以文件导入配置的方式才行
instance_relative_config = False # 是否加载另一个实例的配置
root_path = None # 主模块所在目录的绝对路径,默认为项目目录
3 登录,显示用户信息案例
### 总结
1 当次请求的对象,request对象是全局的,直接导入使用即可
2 前端post提交的数据,在flask中:request.form中取
3 转换器的使用/detail/<int:pk> 等同于django中的有名分组
4 模板语法兼容django的DTL,可以直接使用函数加括号,并且可以传参数
5 session也是全局对象,用户登录信息,放到session中,使用session存值,需要先设置密钥
app.secret_key = 'adfae^^4384045532@@#$#'
6 返回对象:新手四件套
'字符串' ---> HttpResonse('字符串')
redirect('/') ---> redirect('/')
render_template() ---> render()
jsonify ---> JsonResponse()
7 前端get请求提交的数据,在flask中:request.args中取 包装成字典获取
# eg;request.args.get('pk')
8 get请求 ?后面的内容,完整以bytes格式字符串,在flask中:request.query_string中取
# eg: b'pk=1&name=lqz&age=19'
9 @app.route('/detail', methods=['GET'],endpoint='detail')
- 第一个参数:路由匹配
- methods参数:允许的请求方式,默认不写为GET
- endpoint参数:等同于django路由中的name别名 endpoint n. 端点
3.1 flask代码
from flask import Flask, request, render_template, redirect, session, jsonify
# flask中的请求对象是全局的request
# render_template 就是django的render
app = Flask(__name__)
# 使用session,一定要设置秘钥,等同于django配置文件中的密钥
app.secret_key = 'adfae^^4384045532@@#$#'
app.debug = True # 启用调试模式,修改了代码不用重启,自动重启
USERS = {
1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
# request.form 等同于request.POST
name = request.form.get('user')
password = request.form.get('pwd')
if name == 'lqz' and password == '123':
# 登录成功,重定向到首页
# 把登录信息放到session中
session['name'] = name
return redirect('/')
else:
return jsonify({'code': 101, 'msg': '用户名或密码错误'})
@app.route('/', methods=['GET'])
def index():
if session.get('name'):
return render_template('index.html', user_dict=USERS)
else:
# 没有登录,重定向到登陆页面
return redirect('/login')
# 获取url路径后的参数值
# @app.route('/detail/<int:pk>', methods=['GET'])
# def detail(pk):
# print(pk)
# user_detail = USERS.get(pk)
# return render_template('detail.html', info=user_detail)
# 获取get ?后面的参数值
@app.route('/detail', methods=['GET'],endpoint='detail')
def detail():
print(request.query_string) # b'pk=1&name=lqz&age=19'
pk = int(request.args.get('pk'))
user_detail = USERS.get(pk)
return render_template('detail.html', info=user_detail)
if __name__ == '__main__':
app.run(port=8080)
3.2 detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>详细信息 {{info.name}}</h1>
<div>
{{info.text}}
</div>
</body>
</html>
3.3 index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table>
{% for k,v in user_dict.items() %}
<tr>
<td>{{k}}</td>
<td>{{v.name}}</td>
<td>{{v['name']}}</td>
<td>{{v.get('name')}}</td>
<td><a href="/detail/{{k}}">查看详细1</a></td>
<td><a href="/detail?pk={{k}}&name=lqz&age=19">查看详细2</a></td>
</tr>
{% endfor %}
</table>
</body>
</html>
3.4 login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post">
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="登录">{{error}}
</form>
</body>
</html>
4 Flask配置文件
4.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,
}
4.2 设置flask配置
# 查看配置信息
from flask import Flask
app = Flask(__name__)
print(app.config)
# flask把常用的配置,放进了app对象这一层,但实质是在app.config中,且当做字典使用
app.debug = True
app.secret_key = 'asdahdaabsd'
# 实质:
app.config['DEBUG']=True
app.config['SECRET_KEY']='asdfasdfasdfasfasfdasfasfsfa'
### 设置Flask配置的方式:
# 方式一:直接写 一般不用
app.config['DEBUG']=True
# 方式二:通过py文件 一般不用
# 配置文件 settings.py
DEBUG = True
SECRET_KEY = 'asdahdaabsd'
# flask主程序,导入配置文件
app.config.from_pyfile('配置文件.py')
# 注:settings.py文件的路径位置:
settings.py文件默认要放在程序root_path目录, # 即:和flask主模块的同一层
# 也可以导入其他flask实例/其他文件夹下的配置文件
instance_relative_config=True,
instance_path='其他flask实例' # 注:必须是绝对路径
# 方式三:通过环境变量 一般不用
app.config.from_envvar("环境变量名称")
# 通过json文件、字典 一般不用
app.config.from_json("json文件名称")
注:JSON文件名称,必须是json格式,因为内部会执行json.loads
# 通过字典 一般不用
app.config.from_mapping({'DEBUG': True})
# 方式四:通过类的方式 常用
# 配置文件 setting.py # 默认:放在和flask主程序同一层
# 配置基类
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
# flask主程序,导入配置文件
app.config.from_object('settings.DevelopmentConfig')