flask那些事(一)

mac2022-06-30  63

flask配置文件

flask路由系统

@app.route() 装饰器中的参数

如果不明白装饰器 点击这里

methods : 当前 url 地址,允许访问的请求方式
@app.route("/info", methods=["GET", "POST"]) def student_info(): stu_id = int(request.args["id"]) return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{变量名}"
endpoint : 反向url地址,默认为视图函数名 (url_for)
from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info") def student_info(): print(url_for("r_info")) # /info stu_id = int(request.args["id"]) return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{变量名}"
defaults : 视图函数的参数默认值{"nid":1}
from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100}) def student_info(nid): print(url_for("r_info")) # /info # stu_id = int(request.args["id"]) print(nid) # 100 return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"
strict_slashes : url地址结尾符"/"的控制 False : 无论结尾 "/" 是否存在均可以访问 , True : 结尾必须不能是 "/"
# 访问地址 : /info @app.route("/info", strict_slashes=True) def student_info(): return "Hello Old boy info" # 访问地址 : /infos or /infos/ @app.route("/infos", strict_slashes=False) def student_infos(): return "Hello Old boy infos"
redirect_to : url地址重定向
# 访问地址 : /info 浏览器跳转至 /infos @app.route("/info", strict_slashes=True, redirect_to="/infos") def student_info(): return "Hello Old boy info" @app.route("/infos", strict_slashes=False) def student_infos(): return "Hello Old boy infos"
subdomain : 子域名前缀 subdomian="DragonFire" 这样写可以得到 DragonFire.oldboyedu.com 前提是app.config["SERVER_NAME"] = "oldboyedu.com"
app.config["SERVER_NAME"] = "oldboy.com" @app.route("/info",subdomain="DragonFire") def student_info(): return "Hello Old boy info" # 访问地址为: DragonFire.oldboy.com/info

关于路由目前就说这么多,之后的课程中会有关于Flask路由系统的源码剖析,再详细说明Flask路由系统的工作原理

动态参数路由:

from flask import url_for # 访问地址 : http://127.0.0.1:5000/info/1 @app.route("/info/<int:nid>", methods=["GET", "POST"], endpoint="r_info") def student_info(nid): print(url_for("r_info",nid=2)) # /info/2 return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"

就是在url后定义一个参数接收

但是这种动态参数路由,在url_for的时候,一定要将动态参数名+参数值添加进去,否则会抛出参数错误的异常

路由正则:

一般不用,如果有特殊需求,不怕麻烦的话,这个东西还是挺好用的,前提是你的正则玩儿的很6

注意事项以及源码示例:

flask的路由系统比较特殊,是通过装饰器实现的,但是究其本质,还是通过 app.add_url_rute 方法来实现的。 from flask import Flask, request, current_app import importlib app = Flask(__name__) # 导入配置文件 app.config.from_object('settings.DevConfig') # flask路由系统 @app.route('/') def hello_world(): return 'Hello World!'

路由源码以及其分析

# 以 @app.route('/index', endpoint='index', methods=['GET']) 为例 # 函数本质是是个闭包函数 def route(self, rule, **options): # self 表示的app对象的实例 # rule 表示路由 rule='/index' # **options 是其他参数 这里 endpoint='index', methods=['GET'] def decorator(f): # 这里是获取 endpoint的值,如果不存在则为None endpoint = options.pop("endpoint", None) # 本质上是 执行 app.add_url_rule('/index',....) self.add_url_rule(rule, endpoint, f, **options) return f return decorator """ 第一步 执行route 后返回 decorator 第二步 执行@decorator -->decorator(index) """ @app.route('/index', endpoint='index', methods=['GET']) # 参数endpoint不写 默认为函数名,用户反向生成url def index(): print(current_app.config['DB']) return "xxx" def login(): return 'login' # 这是另外一种路由方式,类似于django中的path('',views.....) app.add_url_rule('/login', 'n2',login,methods=['GET', 'POST']) if __name__ == '__main__': app.run() def _endpoint_from_view_func(view_func): """ Internal helper that returns the default endpoint for a given function. This always is the function name. """ assert view_func is not None, "expected view func if endpoint is not provided." # 如果 endpoint=None的时候,返回的是 默认的endpoint view_func的名字 return view_func.__name__

CBV简单实现

from flask import Flask, request, current_app,views import importlib app = Flask(__name__) app.config.from_object('settings.DevConfig') # 装饰器 def auth(func): def inner(*args,**kwargs): result = func(*args,**kwargs) return result return inner class IndexView(views.MethodView): methods = ['GET','POST'] decorators =[auth,] def get(self): return 'index.get' def post(self): return 'index.post' app.add_url_rule('/index',view_func=IndexView.as_view(name='index')) # name=endpoint if __name__ == '__main__': app.run()

源码分析

class MethodView(with_metaclass(MethodViewType, View)): """A class-based view that dispatches request methods to the corresponding class methods. For example, if you implement a ``get`` method, it will be used to handle ``GET`` requests. :: class CounterAPI(MethodView): def get(self): return session.get('counter', 0) def post(self): session['counter'] = session.get('counter', 0) + 1 return 'OK' app.add_url_rule('/counter', view_func=CounterAPI.as_view('counter')) """ # 类似于django中的dispatch,视图类中分发不同请求说对应的方法 def dispatch_request(self, *args, **kwargs): meth = getattr(self, request.method.lower(), None) # If the request method is HEAD and we don't have a handler for it # retry with GET. if meth is None and request.method == "HEAD": meth = getattr(self, "get", None) assert meth is not None, "Unimplemented method %r" % request.method return meth(*args, **kwargs) # 如果是get请求,返回的是 get(*args,**kwargs)

host文件路径(修改本地DNS对应关系)

windows:C:\Windows\System32\drivers\etc\hosts

mac:/etc/hosts

转载于:https://www.cnblogs.com/qianzhengkai/p/11380601.html

最新回复(0)