1. 程式人生 > >Flask框架(一)

Flask框架(一)

今天跟大家分享下,我之前關於flask學習的一些筆記。如果有志同道合的朋友可以互相交流交流。

Flask是第三方框架。

第一方是python官方吉多,第二方我們開發者自己,第三方框架工具類提供者。

虛擬環境

一個特殊的資料夾,裡面放著程式所需要的各種環境,比如擴充套件包,flask版本,python直譯器等內容。

不同程式選用不同虛擬環境互不影響。

知名的框架?

web:

1.flask: 提供基本功能,屬於輕量級

2.django: 提供相對完整功能,重量級

3.tornado: 偏嵌入式web應用,非阻塞式伺服器

爬蟲類:

scrapy

分散式:

spark

大資料:

hadoop

人工智慧:

scikit-learn

apache:

美國軟體基金會組織,裡面提供的都是開源框架,而且免費,比如,Tomcat,HBase,Activty..等等350多個

七行靈魂程式碼(預設埠5000)

#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()

Flask 初始化引數

import __name__:Flask 程式所在的包,傳__name__就可以,

其可以決定flask在訪問靜態檔案時查詢的路徑。

static_url_path 靜態檔案訪問路徑,可以不傳預設為/+static。

static_folder :靜態檔案儲存的資料夾,可以不傳預設為static。

template_folder:模板檔案儲存的資料夾,可以不傳,預設為templates。

Flask相關配置的載入方式

在 Flask 程式執行的時候,可以設定相關配置比如:配置 Debug 模式

(修改程式碼不需要關閉程式,可以實時生效,如果程式碼錯誤會給出友好提示),配置資料庫連線地址等,設定 Flask配置有以下三種方式:

從配置物件中載入(常用)

app.config.from_object()

從配置檔案中載入 app.config.from_pyfile()

從環境變數中載入(瞭解)  app.config.from_envvar()

# 配置物件,裡面定義需要給 APP 新增的一系列配置

class Config(object):

    DEBUG = True

# 從配置物件中載入配置

app.config.from_object(Config)

一.指定路由地址

# 指定訪問檢視函式demo1,訪問路徑為/demo1

第一種

@app.route('/demo1')

def demo1():

return 'demo1'

解決迴圈導包的方式是將非主模組在主模組中匯入

第二種

#先定義函式後用app裝飾

副模組 def detail():

return ‘detail’

在主模組中app,route(‘/detail’)(detail)

二.給路由傳參示例

有時我們需要將同一類 URL 對映到同一個檢視函式處理,比如:使用同一個檢視函式來顯示不同使用者的個人資訊。

# 路由傳遞引數,整數

@app.route('/user/<int:user_id>')

def user_info(user_id):

    return 'the num is %d' % user_id

# 路由傳遞引數,字串,不指定path預設就是字串

@app.route('/user/<path:user_id>')

def user_info(user_id):

return 'hello %s' % user_id

提示:之所以int,pathfloat可以接收整數,字串,小數,是由於werkzeug提供了IntegerConverter,PathConverter對應轉換器.

當系統提供的轉換器滿足不了需求,需要自定義

固定格式:

1. 自定義類(轉換器),繼承自BaseConverter

2. 編寫init方法,接收兩個引數

3. 一個引數給父類空間初始化, 另外一個給子類規則初始化

4. 將自定義的轉換器,新增到系統預設的轉換器列表中 (app.url_map.converters)

from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 1. 自定義類(轉換器),繼承自BaseConverter

class MyRegexConverter(BaseConverter):

    #不能寫死,不夠靈活

    # regex = '\d{3}'

    # 2.編寫init方法, 接收兩個引數

    def __init__(self,url_map,regex):

        # 3.一個引數給父類空間初始化, 另外一個給子類規則初始化

        super(MyRegexConverter, self).__init__(url_map)

        self.regex = regex

# 4. 將自定義的轉換器,新增到系統預設的轉換器列表中(app.url_map.converters)

app.url_map.converters["re"] = MyRegexConverter

print(app.url_map.converters)

#re()好比是呼叫了init方法,引數1:app.url_map, 引數2:是括號裡面內容

@app.route('/<re("\d{3}"):number>')

def hello_world(number):

    return "the number is %s"%number

jsonify(返回的json資料可以被ajax接收並在方法中可以呼叫處理)

後端返回指定的json資料型別給前端瀏覽器使用,jsonify生成json資料響應體。

return jsonify(dict)

簡化為 return jsonify(key=value,key=value)

return jsonify(name=’zhangsan’,age=”13”)

重定向

redirect(重定向),url_for,生成文字響應體

格式: redirect("地址") 自動向地址中跳轉檢視函式

注意點: redirect有個代號叫做302

url_for: 反解析,根據檢視函式名稱,找到路徑,好處:可以傳遞引數

格式:url_for('檢視函式',key=value)

@app.route('/rng')

def rng():

    return redirect(url_for('lpl', token=1))

@app.route('/lol')

def lol():

    return '我們有最棒的比賽<a href=%s>lpl</a>'%url_for('lpl',token=2)

@app.route('/lpl/<int:token>')

def lpl(token):

    if token == 1:

        return "我們是冠軍"

    elif token == 2:

        return "這裡是世界最強的賽區lpl!"

    else:

        return "LPL今年S8奪冠!"