一。flask的造成。html
flask是一個基於python而且以來jinja2模板和werkzeug wsgi服務器的一個微型框架。python
安裝了flask模塊就表明安裝了wekzeug,因此先安裝flask.mysql
pip install flask
而werkzeug 的使用能夠參考下面:web
from wsgiref.simple_server import make_server def mya(environ, start_response): print(environ) start_response('200 OK', [('Content-Type', 'text/html')]) if environ.get('PATH_INFO') == '/index': with open('index.html','rb') as f: data=f.read() elif environ.get('PATH_INFO') == '/login': with open('login.html', 'rb') as f: data = f.read() else: data=b'<h1>Hello, web!</h1>' return [data] if __name__ == '__main__': myserver = make_server('', 8011, mya) print('監聽8011') myserver.serve_forever()
二。flask啓動分析。sql
基本的flask的使用以下:django
from flask import Flask app=Flask(__name__) @app.route('/') def index(): return "ok" if __name__ == '__main__': #本質是 run_simple(host, port, app, **options) #app(),對象加(),執行__call__ app.run()
當app.run運行的時候,首先生成類,類的__call__方法首先建立運行的就是wsgi_app方法,首先把運行環境搭建。json
在app中的run方法本質就是執行run_simple方法,run_simple方法所作的就是werkzeug.serving中的。flask
三。flask中的4劍客,服務器
和django中同樣flask也有4個視圖函數,對應關係以下:session
四。flask的配置文件方式。
當flask須要配置文件的時候,有如下主要的四種方式:
1.直接經過app=flask(__name__),中的app,修改其中參數。:
app.debug=True app.secret_key="123123"
2.以字典的形式修改其中的cinfig
app.config['DEBUG']=True
3.以文件的形式
app.config.from_pyfile("settings.py")
setting.py
DEBUG = True
4.經過文件中的類名進行的插拔式的設置,通常這種設置都放在一個文件中:
app.config.from_object("python類或類的路徑") app.config.from_object('pro_flask.settings.TestingConfig')
settings
class Config(object): DEBUG = False TESTING = False DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config): DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config): DEBUG = True class TestingConfig(Config): TESTING = True
配置的元素:
{ 'DEBUG': get_debug_flag(default=False), 是否開啓Debug模式 'TESTING': False, 是否開啓測試模式 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), 'USE_X_SENDFILE': False, 'LOGGER_NAME': None, 'LOGGER_HANDLER_POLICY': 'always', 'SERVER_NAME': None, 'APPLICATION_ROOT': None, 'SESSION_COOKIE_NAME': 'session', 'SESSION_COOKIE_DOMAIN': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), 'TRAP_BAD_REQUEST_ERRORS': False, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'JSON_AS_ASCII': True, 'JSON_SORT_KEYS': True, 'JSONIFY_PRETTYPRINT_REGULAR': True, 'JSONIFY_MIMETYPE': 'application/json', 'TEMPLATES_AUTO_RELOAD': None, }
五。路由系統。
路由通常是以裝飾器的方式放到須要進行修飾的視圖函數上。
@app.route('/login',methods=['POST',"GET"],endpoint="sb") def login(): return "login"
在route中,其中的是一個decorator運行的是add_url_rule():
rule是一個路由,表明網頁訪問它所使用的路由。
endpoint是視圖函數起的別名。
f 表明的是傳入的視圖函數。
**options表明其餘參數。
1.add_url_rule
這個函數中會具體實現視圖函數,返回值,並彈出methons,判斷它的請求方式:
endpoint表明的是在視圖函數中,經過url_for反向解析出的路由。也就是取別名,可是每一個別名不能相同。#add_url_rule 源碼中,
endpoint若是爲空,endpoint = _endpoint_from_view_func(view_func),最終取view_func.__name__(函數名)。
app的寫法還有如下這種:
app.add_url_rule('/login/<string:nid>',view_func=login,endpoint="sb",methods=['POST',"GET"])
2.路由的傳參:
在rule中,能夠經過如下方式傳入參數,傳入的參數會變成對應的類型:
app.add_url_rule('/login/<string:nid>',view_func=login,endpoint="sb",methods=['POST',"GET"])
轉換器還有如下類型:
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
六。cbv的分析
在調用cbv的視圖函數的時候,基本形式以下:
class loginview(views.View): # def dispatch_request(self): def dispatch_request(self,*args,**kwargs): print('666') print(args) print(kwargs) return '111' app.add_url_rule('/login',view_func=loginview.as_view(name='login'))
每一個視圖函數中都須要走as_view函數,若是沒有name參數,全部的視圖類函數都將以view命名,難以區分,因此這裏的name也至關於endpoint。
decorators
這個參數表明的是裝飾器,能夠將齊總的裝飾器都裝飾到view函數中。
若是沒有decorators,則進行如下步驟:
將,methods傳給類對象,將本類定義到view_class,最後給view執行。
執行的結果仍是運行本類中的dispatch_request,這個函數只有在自定義的類中定義。
七。cbv分發url類型。
如何將flask中的cbv像django中的同樣,能夠針對不一樣的請求方式執行對應的函數。
首先lei繼承自MethodView:
經過全局的配置request中讀取獲取數據的方法,再從本類中反射,執行該語句。:
class loginview(views.MethodView): def get(self): dict1 = { 'name':'lzx', 'age':'10', 'add':'shanghai' } return render_template('login.html',name='lzx',name_dict=dict1) def post(self): dict1 = { 'name':'lzx' } return render_template('login.html',name='lzx',name_dict=dict1)
這時候就不能寫dispatch_request函數了。