day92:flask:flask简介&基本运行&路由&HTTP请求和响
目录1.Flask简介 2.关于使用flask之前的准备 3.flask的基本运行 4.flask加载配置 5.传递路由参数(没有限定类型) 6.传递路由参数(通过路由转换器限定路由参数的类型) 7.自定义路由转换器 8.路由限定请求方式 9.注册路由和视图代码进行分离 10.flask的HTTP请求 11.flask的HTTP响应 1.Flask简介
Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
官方文档:
可以通过 https://pypi.org/search/?c=Framework+%3A%3A+Flask 查看更多flask官方推荐的扩展 2.关于使用flask之前的准备
1.为flask单独安装一套虚拟环境 mkvirtualenv flask -p python3 2.在虚拟环境中安装flask pip install flask==0.12.5 3.创建flask项目
例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境 3.flask的基本运行
from flask import Flask # 创建应用对象 app = Flask(__name__) 视图加载 @app.route(rule="/") 声明路由 def index(): 声明视图函数 return <h1>python31</h1>" 直接通过return返回普通字符串 if __name__ == '__main__': 启动项目,不要在run 后面写任何代码,不会被执行到 app.run(debug=True,port=8000,host=0.0.0.0 wsgiref模块提供的 4.flask加载配置Flask app = Flask( 配置类 class Config(): DEBUG = True 开启调试模式 通过app.config来加载配置 app.config.from_object(Config) @app.route(rule=") def index(): " : app.run(port=8000,1)">") 5.传递路由参数(没有限定类型)Flask app = Flask( Config(): DEBUG = True app.config.from_object(Config) 路由: 一种访问地址[url]和应用程序[视图]进行一对一绑定的映射关系 # 往往在开发中,我们所说的路由,其实通常指代完成路由绑定关系的路由类 @app.route(rule=/user/<user_id>-<mobile> 可以指定一个或多个参数进行传递 def index(user_id,mobile): 这里的参数名称必须和路由上面的保持一致。 user_id=%s,mobile=%s" % (user_id,mobile) : app.run() 6.传递路由参数(通过路由转换器限定路由参数的类型)True app.config.from_object(Config) 路由转换器对路由参数的类型进行限定 @app.route(rule=/<float:user_id>") def index(user_id): print(type(user_id)) <class 'float'> user_id=%s user_id : app.run() 7.自定义路由转换器自定义路由转换器 1. 声明的路由转换器类必须直接或间接继承于BaseConverter from werkzeug.routing BaseConverter MobileConverter(BaseConverter): 2. 必须在初始化中调用父类对象进行初始化 def __init__(self,*args,**kwargs): 3. regex必须有参数 self.regex = r1[3-9]d{9} super().__init__(*args,1)">kwargs) 4. 注册你自己定义的路由转换器 app.url_map.converters["使用别名"] = 转换器类名 app.url_map.converters[mob"] = MobileConverter @app.route(rule=/<mob:user_id> user_id : app.run() 8.路由限定请求方式路由转换器对路由参数的类型进行限定 '''@app.route(rule="/",methods=["POST","PUT","PATCH","DELETE"])''' @app.route(rule= 没有填写第二个参数methods则默认只能通过get请求访问 index(): ok" : app.run(debug=True) 9.注册路由和视图代码进行分离也可以让路由注册和视图进行分离 app.add_url_rule(rule=",view_func=index) : app.run(debug=True) 10.flask的HTTP请求
常用的属性如下:
? ? ? ? ? ? ? ? ? ? ? 1.request.formFlask,request from werkzeug.datastructures ImmutableMultiDict app = Flask() @app.route(/formPOSTPUTPATCH]) get_form(): print(request) HTTP请求处理对象 接受post提交表单数据 print(request.form) """打印效果: ImmutableMultiDict([('username','xiaoming'),('password','123456'),('lve','swimming'),'game'),'shopping')]) # ImmutableMultiDict 这个类就是一个字典的子类,我们可以称之为类字典对象,所以可以通过字典的操作来使用。 # 思路来源: from collection import OrderedDict """ 获取指定键的单个值 print(request.form.get(username)) print(request.form["]) 和上面的一样,没有区别 lve 如果键对应的数据有多个值,则不能通过get或中括号 获取指定键获取多个值 print(request.form.getlist(")) ['swimming','game','shopping'] 格式转换:to_dict() ImmutableMultiDict 转换成基本格式 注意: 转换过程中,如果出现一个键对应多个值的情况,则取第一个值 ret = request.form.to_dict() {'username': 'xiaoming','password': '123456','lve': 'swimming'} : app.run(debug=True) 2.request.其他/query get_query_params(): 获取查询字符串 query_params""" 127.0.0.1:5000/?username=xiaoming&age=18""" (request.args) print(request.args.to_dict()) @app.route(/head get_head(): 获取请求头数据(request.headers) print(request.headers[Content-Type application/x-www-form-urlencoded 获取自定义请求头[首字母大写,不支持多个单词使用横杠进行拼接的写法,也不支持多字节字符] Company oldboyedu GETprint(request.method) GET 获取本次客户端的请求方法名 print(request.url) http://127.0.0.1:5000/ url地址 print(request.json) {'pay_type': 1,'credit': 0,'coupon': 0} 获取json数据 print(request.files) ImmutableMultiDict([('video1',<FileStorage: 'demo.mp4' ('video/mp4')>)]) print(request.files.get(video1: app.run(debug=True) 11.flask的HTTP响应
数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式 页面响应: 重定向 ?url_for 视图之间的跳转 响应的时候,flask也支持自定义http响应状态码 1.响应html文本
index(): 返回html数据""" 这三种形式一模一样''' return "<h1>hello user</h1>" return make_response("<h1>hello user</h1>") # 上面的代码是这段代码的简写 return Response("<h1>hello user</h1>") # 上面make_response本质上就是Response 2.响应json数据index(): 返回json格式数据 data = {"name":"xiaoming","age":13} return make_response(jsonify(data)) return jsonify(data) 两种方式都可以响应json数据 3.重定向redirectredirect 页面跳转响应 @app.route(/user user(): 页面跳转 redirect函数就是response对象的页面跳转的封装 return redirect(http://www.baidu.com") 4.重定向到自己写的视图函数:url_for/indexindex" 转内跳转,进行视图之间的跳转 @app.route( home(): 视图之间的跳转 return redirect(url_for(xiaoming)) : app.run(debug=True) 5.自定义状态码和响应头@app.route(/demo4 demo4(): 状态码为 666',400 还可以使用make_response创建Response对象,然后通过response对象返回数据""" make_response @app.route(/rep index7(): response = make_response() (response) response.headers["] = oldboy" 自定义响应头 response.status_code = 201 自定义响应状态码 return response ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |