day89_11_11Flask啓動,配置,路由,fbv和cbv

一。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()
View Code

二。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

  Httpresponse = > ''

  render            => render_template

  redirect          => redirect

  JsonResponse  =>  jsonify

  1.''

  直接返回字符串到頁面。

  2.render_template

  返回一個模板,並經過關鍵字傳參的方式將數據發送到模板進行渲染。

  3.redirect

  跳轉頁面,須要傳入路由。

  4.jsonify

  須要返回json數據。

四。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函數了。

相關文章
相關標籤/搜索