python-Web-flask-路由和视图
1 路由和视图:
简介:
Flask框架包含两个核心:Werkzeug工具箱,Jinja2模板引擎
flask: 提供基本功能,属于轻量级
django: 提供相对完整功能,重量级
搭建虚拟环境
Helloworld :
#1.导入Flask类 from flask import Flask #2.创建Flask对象接收一个参数__name__,它会指向程序所在的包 app = Flask(__name__) #3.装饰器的作用是将路由映射到视图函数index @app.route('/') def index(): return 'Hello World' #4.Flask应用程序实例的run方法,启动WEB服务器 if __name__ == '__main__': app.run()
相关配置参数:
初始化参数:
app = Flask(__name__) static_url_path静态文件访问路径,默认为:/ + static static_folder静态文件存储的文件夹,默认为 static template_folder模板文件存储的文件夹,默认为 templates
加载参数:
from flask import Flask app = Flask(__name__) # 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True app.config.from_object(Config)# 从配置对象中加载配置 #app.config.from_pyfile('config.ini')# 从配置文件中加载配置 #app.config.from_envvar('FLASKCONFIG')# 加载指定环境变量名称所对应的相关配置 @app.route('/') def index(): return 'Hello World' if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug = True)
路由:
设置路由,路径,参数,请求方式
# 路由传递参数,整数,get或post方式 @app.route('/user/<int:user_id>',methods=['GET', 'POST']) def user_info(user_id): return 'the num is %d' % user_id
响应:
# 生成json数据响应体 @app.route('/demo4') def demo4(): json_dict = { "user_id": 10, "user_name": "laowang" } return jsonify(json_dict) # 路由传递参数string @app.route('/user/<int:user_id>') def user_info(user_id): return 'hello %d' % user_id # 重定向redirect(url_for(‘’,参)) @app.route('/demo5') def demo5(): # 使用 url_for 生成指定视图函数所对应的 url return redirect(url_for('user_info', user_id=100)) # 渲染响应render_response(‘’,name=name)
转换器:
一.系统自带转换器
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
二.自定义转换器
from flask import Flas k#导入基类转换器 from werkzeug.routing import BaseConverter app = Flask(__name__) # 1.自定义类,继承自BaseConverter class MyRegexConverter(BaseConverter): # 2.编写初始化方法, init方法, 接收两个参数, url_map, regex, 并初始化父类空间和子类空间 def __init__(self,url_map,regex): super(MyRegexConverter, self).__init__(url_map) self.regex = regex # 3.将自定义转换器类,添加到默认的转换列表中 app.url_map.converters['re'] = MyRegexConverter #使用自定义转换器#接收3位整数 @app.route('/<re("\d{3}"):num>') def hello_world(num): print("num = %s"%num) return "the num is %s"%num #接收一个手机号 @app.route('/<re("1[345678]\d{9}"):mobile>') def get_phone_number(mobile): return "the mobile is %s"%mobile if __name__ == '__main__': app.run()
异常捕获:
from flask import Flask,abort app = Flask(__name__) @app.route('/game/<int:age>') def play_game(age): #异常抛出 abort(404) return "helloworld" #异常捕获 @app.errorhandler(404) def page_not_found(e): print(e) return "找不到服务器资源,服务器搬家了" if __name__ == '__main__': app.run()
钩子:
请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:
# 在第一次请求之前调用,可以在此方法内部做一些初始化操作 @app.before_first_request def before_first_request(): print("before_first_request") # 在每次请求之前调用,直接return之后那么就不会执行视图函数 @app.before_request def before_request(): print("before_request") # 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理 @app.after_request def after_request(response): print("after_request") response.headers["Content-Type"] = "application/json" return response # 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息 @app.teardown_request def teardown_request(e): print("teardown_request")
Request:
属性 |
说明 |
类型 |
data |
记录请求的数据,并转换为字符串 |
* |
form |
记录请求中的表单数据 |
MultiDict |
args |
记录请求中的查询参数 |
MultiDict |
cookies |
记录请求中的cookie信息 |
Dict |
headers |
记录请求中的报文头 |
EnvironHeaders |
method |
记录请求使用的HTTP方法 |
GET/POST |
url |
记录请求的URL地址 |
string |
files |
记录请求上传的文件 |
* |