Flask是一个基于Python开发并且依赖jinja2模板(DTL)和Werkzeug WSGI(符合wsgi协议的web服务器,wsgiref)服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
下载安装pip install flaskpython使用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)
‘’’
参数
-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