介绍
Flask是一个基于Python开发并且依赖jinja2模板(DTL)和Werkzeug WSGI(符合wsgi协议的web服务器,wsgiref)服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
下载安装
pip install flask
python使用flask
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
flask的配置
flask配置文件写法很多种
# 第一种写法
app.secret_key='asfasdf'
app.debug=True
# 第二种:app所有的配置项都在app.config这个字典中
app.config['DEBUG']=True
print(app.config)
# 第三种:仿django的settings.py 写法
app.config.from_pyfile('settings.py')
print(app.config['NAME'])
# 第四种:通过类的方式
app.config.from_object('settings.DevelopmentConfig')
print(app.config)
# 其他:
app.config.from_envvar("环境变量名称")
app.config.from_json("json文件名称")
flask的路由
flask 路由写法:基于装饰器,跟djagno有区别,本质其实是一样的,sanic,fastapi就是这种路由方式
flask路由和djagno路由的区别?
-
在django中,路由是浏览器访问服务器时,先访问的项目中的url,再由项目中的url找到应用中url, 这些url是放在一个列表里,遵从从前往后匹配的规则。
-
在flask中,路由是通过装饰器给每个视图函数 提供的,而且根据请求方式的不同可以一个url用于不同的作用。
flask的路由:
@app.route('/index', methods=['GET'], endpoint='index')
def index():
return 'hello'
Django的路由:
urlpatterns = [
path('admin/', admin.site.urls),
]
toute源码分析
‘’’
#1 装饰器 @route python特殊语法糖,会把下面的函数当参数传入 order=route(order) 以后调用order本质就是在执行route(order)()
#2 route的内层函数---->本质是self.add_url_rule(rule, endpoint, f, **options)
def decorator(f):
endpoint = options.pop(“endpoint”, None)
self.add_url_rule(rule, endpoint, f, **options)
return f
#3 self是app对象,add_url_rule 其实就Flask类的add_url_rule方法
#4 所以我们可以不使用装饰器来注册路由,而自己写
app.add_url_rule(‘/order/string:pk’,view_func=order)
app.add_url_rule(‘/index’,view_func=index)
‘’’
add_url_rule参数
参数
-rule:请求的路径,可以使用转换器
-endpoint:别名--》反向解析
-view_func:视图类.as_view(name='xx')(视图函数内存地址)
-methods:允许的请求方式
# ---------以下不重要-----
-defaults:字典,给视图函数传默认值
-strict_slashes:对URL最后的 / 符号是否严格要求
-redirect_to
默认转换器
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
请求响应
@app.route('/login.html', methods=['GET', "POST"])
def login():
####请求对象的属性和方法
# request:是全局的request,用起来就当是每个请求都有一个request即可
print(request.method) # 请求方式
print(request.args) # get 请求参数
print(request.form) # post提交的数据
print(request.values) # get,post提交的数据总和
print(request.cookies) # cookies
print(request.headers) # 请求头
print(request.path) # 路径
print(request.full_path) # 全路径
print('-----',request.script_root)
# request.url 带域名带参数的请求路径
print(request.url) # 带服务器地址的全路径
# request.base_url 带域名请求路径
print(request.base_url) # 不带地址的全路径
# request.url_root 域名
print(request.url_root) # 域名+端口
# request.host_url 域名
print(request.host_url) # 域名+端口
# request.host
print(request.host) # 不带http的域名+端口
from werkzeug.datastructures import FileStorage
print(type(request.files.get('files')))
响应对象
##1 向浏览器中写入cookie,四件套都可以使用make_response包裹一下变成响应对象
res=make_response(render_template('home.html'))
res.set_cookie('name','lqz')
# delete_cookie # 删除cookie
## 2 向浏览器中写响应头
res.headers['X-Something'] = 'A value'
return res