Flask 简介
一个非常小的框架,可以称之为微型框架,只提供一个强劲的核心,其他的功能都需要使用拓展来实现。意味着可以根据自己的需求量身打造。
Flask 组成
- 调试、路由、wsgi系统
- 模板引擎(JInja2)
Flask 的简单使用
# 导入 Flask 类库
from flask import Flask
# 创建应用实例
app = Flask(__name__)
# 视图函数(路由)
@app.route('/')
def index():
return "Hello World"
# 启动
if __name__ == "__main__":
app.run()
- Flask - 参数是应用模块或者包的名称。如果使用单一模块,就应当使用__name__。这个参数是必须的,这样Flask才能知道在哪里可以找到模板和静态文件。
- name - Python的内置类属性,代表对应程序的名称。自己运行这段代码,name 的值为 main(一段程序作为主线运行程序时其内置名称就是__main__)。我管自己叫我自己(main),但在其他人眼里我就是小仙女(xxx)
- @ - 装饰器。本质上是一个函数,可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象(函数指针)。
- 实质:是一个函数
- 参数:要装饰的函数名(并非函数调用)
- 返回:装饰完的函数名(也不是函数调用)
- 作用:为已经存在的对象添加额外的功能
- 特点:不需要对对象做出任何代码上的改动
- Run 方法参数
- debug - 代码更新是否自动重启,默认值:False
- theaded - 是否开启多线程,默认值:False
- port - 指定端口,默认值:5000
- host:指定主机(设置0.0.0.0可以通过本地IP访问),默认值:127.0.0.1
- 请求和相应
- current_app - 相当于在主程序中激活的实例化 app(app=Flask(name))
- g - 一次性函数,处理请求的临时变量。只在一个请求中被应用,下个请求开始时会自动充值
- requests - 请求对象,存放客户端发来的HTTP信息
- session - 记录用户和服务器之间的会话的。在服务器端记录需要记住的信息,(和cookie对应,cookie是存放在客户端)。
- 请求钩子装饰器
- before_first_request - 第一次请求之前
- before_request - 每次请求之前
- app.after_request - 没有异常,每次请求结束后
- app.teardown_request - 有异常也会运行,每次请求结束后
视图函数
带参数的视图函数
# 带参视图函数
@app.route('/user/username')
def say_hello(username):
return f"你好啊,{username}"
带类型限定的视图函数
# 类型限定的视图函数
@app.route('/user/<path:info>')
def test(info):
return info
备注:path:info之间不能有空格。
获取 request 请求值
from flask import Flask, reuqest
... # 省略创建等内容
@app.route('/request/<path:info>')
def request_url(info):
return request.url
'''
http://127.0.0.1:5000/request/test?username=assd&pwd=123456
'''
return request.base_url
'''
http://127.0.0.1:5000/request/test
'''
return request.host_url
'''
http://127.0.0.1:5000/
'''
return request.method # GET
return request.remote_addr # 127.0.0.1
return request.args.get('username') # assd
return request.args.get('pwd') # 123456
return str(request.args)
'''
ImmutableMultiDict([('username', 'assd'), ('pwd', '123456')])
'''
return request.headers.get('User-Agent')
'''
Mozilla/5.0 ...
'''
响应构造
@app.route('/response')
def response():
# 不指定状态码,默认为200,表示可以访问。
# return 'OK'
# 构造 404 状态码
# 方法一
return 'Not Found', 404
# 方法二
# 导入 make_response
# 自定义构造一个相应,然后返回200, 构造也可以指定404
res = make_response('我是通过函数构造的响应', 404)
return res
重定向
@app.route('/old/')
def old():
return redirect('https://www.baidu.com/')
return redirect('/new/')
return redirect(url_for('new'))
return redirect(url_for('say_hello', username='小明'))
@app.route('/new/')
def new():
return "This is a new content!"
Abort
@app.route('/login')
def login():
# return '正常登陆'
abort(404)
报错:ValueError: urls must start with a leading slash
原因:路由名前缺少 ‘/’
会话控制
Cookie
@app.route('/set_cookie/')
def set_cookie():
resp = make_response("设置cookie")
expires = time.time() + 10
resp.set_cookie('name', 'xiaoming', expires=expires)
return resp
def get_cookie():
return request.cookie.get('name') or 'who are you?'
Session
app.config['SECRET_KEY'] = os.urandom(18)
@app.route('/set_session/')
def set_session():
session['username'] = 'xiaowu'
return 'session已经设置了'
@app.route('/get_session/')
def get_session():
return session.get('username', 'who are you?')
Jinja模板常用函数
- capitalize-首字母大写
- upper-全部大写
- lower-全部小写
- title-每个单词首字母大写
- trim-去掉两边空白
- striptags-去掉所有的HTML标签
- safe-删除标签,又保留标签功能
函数使用方法
- 在要解析的变量的后面添加一个 |
- 在 | 的后面他添加一个需要处理的函数
Jinja继承模板
{% extends 'model.html' %}
{% block title %}{% endblock%}