路由和檢視
阿新 • • 發佈:2018-11-14
title: 路由和檢視
date: 2018-10-29 11:06:17
tags: flask
categories: 十月,2018
什麼是wsgi?
web服務閘道器介面,wsgi是一個協議,實現該協議的模組: - wsgiref - werkzeug 實現其協議的模組本質上就是socket服務端用於接收使用者請求,並處理 一般web框架基於wsgi實現,這樣實現關注點分離。 wsgiref示例: from wsgiref.simple_server import make_server def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8000, run_server) httpd.serve_forever() wsgizeug示例: from werkzeug.wrappers import Response from werkzeug.serving import run_simple def run_server(environ, start_response): response = Respoense('hello') return response(environ, start_response) if __name__ == '__main__': run_simple('127.0.0.1', 8000, run_server) Flask原始碼入口: from werkzeug.wrappers import Response from werkzeug.serving import run_simple class Flask(object): def __call__(self,environ, start_response): response = Response('hello') return response(environ, start_response) def run(self): run_simple('127.0.0.1', 8000, self) app = Flask() if __name__ == '__main__': app.run()
Flask 提供功能
- 配置檔案 - 所有配置都在app.config中 - app.config["xx"] = 123 - app.config.from_object("類的路徑") - 應用:importlib、getattr - django中介軟體 - rest framework全域性變數 - session - 加密後放置在使用者瀏覽器的cookie中 - 流程: - 請求到來 - 檢視函式 - 請求結束 - 配置檔案 - 閃現 - 基於session實現 - 路由 - 裝飾器(帶引數) - 自定義裝飾器放下面 - 引數 - url_for - 檢視 - FBV - 請求和響應 - 請求:request - 響應:4種(字串、Response物件、重定向型別redirect()、錯誤碼處理abort(404)) - 模板 - ...... - 特殊裝飾器 - before_first_request - before_request - after_request - template_global() - template_filter() - errorhandler(404) - 中介軟體
路由和檢視
- 路由 + 檢視 - 路由設定的兩種方式: - @app.route('/xxx') def index(): return "index" - def index(): return "index" app.add_url_rule("/xxx",None,index) - 注意事項: - 不能讓endpoint重名 - 如果重名函式也要重名 - 引數 - rule, URL規則 - view_func, 檢視函式名稱 - endpoint=None, 名稱,用於反向生成URL,即: url_for('名稱') - methods=None, 允許的請求方式,如:["GET","POST"] - strict_slashes=None, 對URL最後的 / 符號是否嚴格要求, - redirect_to=None, 重定向到指定地址 - defaults=None, 預設值,當URL中無引數,函式需要引數時,使用defaults={'k':'v'}為函式提供引數 - subdomain=None, 子域名訪問 - CBV import functools from flask import Flask, views app = Flask(__name__) def wrapper(func): @functools.wraps(func) def inner(*args, **kwargs): return func(*args **kwargs) return inner class UserView(views.MethodView): methods = ['GET'] decorators = [wrapper,] def get(self, *args, **kwargs): return 'GET' def post(self, *args, **kwargs): return 'POST' app.add_url_rule('/user', None, UserView.as_view('uuuu')) if __name == '__main__': app.run() - 自定義正則: from flask import Flask,url_for app = Flask(__name__) # 步驟一:定製類 from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter): """ 自定義URL匹配正則表示式 """ def __init__(self, map, regex): super(RegexConverter, self).__init__(map) self.regex = regex def to_python(self, value): """ 路由匹配時,匹配成功後傳遞給檢視函式中引數的值 :param value: :return: """ return int(value) def to_url(self, value): """ 使用url_for反向生成URL時,傳遞的引數經過該方法處理,返回的值用於生成URL中的引數 :param value: :return: """ val = super(RegexConverter, self).to_url(value) return val # 步驟二:新增到轉換器 app.url_map.converters['reg'] = RegexConverter """ 1. 使用者傳送請求 2. flask內部進行正則匹配 3. 呼叫to_python(正則匹配的結果)方法 4. to_python方法的返回值會交給檢視函式的引數 """ # 步驟三:使用自定義正則 @app.route('/index/<reg("\d+"):nid>') def index(nid): print(nid,type(nid)) print(url_for('index',nid=987)) return "index" if __name__ == '__main__': app.run()