Flask快速入門,知識整理

1、Flask介紹(輕量級的框架,很是快速的就能把程序搭建起來)

Flask是一個基於Python開發而且依賴jinja2模板和Werkzeug WSGI服務的一個微型框架,對於Werkzeug本質是Socket服務端,其用於接收http請求並對請求進行預處理,而後觸發Flask框架,開發人員基於Flask框架提供的功能對請求進行相應的處理,並返回給用戶,若是要返回給用戶複雜的內容時,須要藉助jinja2模板來實現對模板的處理,即:將模板和數據進行渲染,將渲染後的字符串返回給用戶瀏覽器。html

「微」(micro) 並不表示你須要把整個 Web 應用塞進單個 Python 文件(雖然確實能夠 ),也不意味着 Flask 在功能上有所欠缺。微框架中的「微」意味着 Flask 旨在保持核心簡單而易於擴展。Flask 不會替你作出太多決策——好比使用何種數據庫。而那些 Flask 所選擇的——好比使用何種模板引擎——則很容易替換。除此以外的一切都由可由你掌握。如此,Flask 能夠與您珠聯璧合。java

默認狀況下,Flask 不包含數據庫抽象層、表單驗證,或是其它任何已有多種庫能夠勝任的功能。然而,Flask 支持用擴展來給應用添加這些功能,如同是 Flask 自己實現的同樣。衆多的擴展提供了數據庫集成、表單驗證、上傳處理、各類各樣的開放認證技術等功能。Flask 也許是「微小」的,但它已準備好在需求繁雜的生產環境中投入使用。python

工具善其事,必先利其器。學習Flask所使用的軟件環境以下:web

python 3.6
Flask 0.12
Python的IDE我使用的是PyCharm。
pip3 install flask數據庫

第一步:使用PyCharm創建Flask工程flask

Flask快速入門,知識整理

Flask快速入門,知識整理

第二步:執行FlaskStudy.py瀏覽器

控制面板輸出以下:緩存

C:05SoftPython36python.exe C:/03Study/Python/FlaskStudy/FlaskStudy.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

第三步:瀏覽器中輸入:服務器

Flask快速入門,知識整理

使用Flask,咱們已經創建了一個最最簡單的web程序。cookie

第四步:簡單說明app程序

from flask import Flask

print(__name__)
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

1.首先,咱們導入了 Flask 類。這個類的實例將會是咱們的 WSGI 應用程序。
2.接下來,咱們建立一個該類的實例,第一個參數是應用模塊或者包的名稱。 若是你使用單一的模塊(如本例),你應該使用 
__name__ ,由於模塊的名稱將會因其做爲單獨應用啓動仍是做爲模塊導入而有不一樣( 也便是 '__main__' 或實際的導入名)。這是必須的,這樣 Flask 才知道到哪去找模板、靜態文件等等。

3.而後,咱們使用 route() 裝飾器告訴 Flask 什麼樣的URL 能觸發咱們的函數。
4.這個函數的名字也在生成 URL 時被特定的函數採用,這個函數返回咱們想要顯示在用戶瀏覽器中的信息。
5.最後咱們用 run() 函數來讓應用運行在本地服務器上。 其中 if name__ == '__main__': 確保服務器只會在該腳本被 Python 解釋器直接執行的時候纔會運行,而不是做爲模塊導入的時候。
第五步:更改配置

app.run(host="127.0.0.1", port=8090, debug=True)

能夠修改端口號,執行模式改成debug,調試模式。

debug=True在生成環境上不建議。app.debug = True完成一樣的功能

與Django的簡單比較

Django:無socket,依賴第三方模塊wsgi,中間件,路由系統(CBV,FBV),視圖函數,ORM。cookie,session,Admin,Form,緩存,信號,序列化。。
Flask:無socket,中間件(須要擴展),路由系統,視圖(CBV)、第三方模塊(依賴jinja2),cookie,session弱爆了

2、基本使用

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

1.實例化Flask對象時,可選的參數

app = Flask(__name__)    # 這是實例化一個Flask對象,最基本的寫法
# 可是Flask中還有其餘參數,如下是可填的參數,及其默認值

def __init__(self, import_name, static_path=None, static_url_path=None,
                 static_folder='static', template_folder='templates',
                 instance_path=None, instance_relative_config=False,
                 root_path=None):

template_folder:模板所在文件夾的名字

root_path:能夠不用填,會自動找到,當前執行文件,所在目錄地址

在return render_template時會將上面兩個進行拼接,找到對應的模板地址

static_folder:靜態文件所在文件的名字,默認是static,能夠不用填

static_url_path:靜態文件的地址前綴,寫成什麼,訪問靜態文件時,就要在前面加上這個

app = Flask(name,template_folder='templates',static_url_path='/xxxxxx')

如:在根目錄下建立目錄,templates和static,則return render_template時,能夠找到裏面的模板頁面;如在static文件夾裏存放11.png,在引用該圖片時,靜態文件地址爲:/xxxxxx/11.png

  instance_path

 instance_relative_config是配合來用的。

這兩個參數是用來找配置文件的,當用app.config.from_pyfile('settings.py')這種方式導入配置文件的時候會用到

instance_relative_config:默認爲False,當設置爲True時,from_pyfile會從instance_path指定的地址下查找文件。

instsnce_path:指定from_pyfile查詢文件的路徑,不設置時,默認尋找和app.run()的執行文件同級目錄下的instance文件夾;若是配置了instance_path(注意須要是絕對路徑),就會從指定的地址下里面的文件

2.綁定路由關係的兩種方式

#方式一
    @app.route('/index.html',methods=['GET','POST'],endpoint='index')
    def index():
        return 'Index'

#方式二

def index():
    return "Index"

self.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])    #endpoint是別名
or
app.add_url_rule(rule='/index.html', endpoint="index", view_func=index, methods=["GET","POST"])
app.view_functions['index'] = index

添加路由關係的本質:將url和視圖函數封裝成一個Rule對象,添加到Flask的url_map字段中

3.Flask中裝飾器應用

from flask import Flask,render_template,request,redirect,session
app = Flask(__name__)
app.secret_key = "sdsfdsgdfgdfgfh"   # 設置session時,必需要加鹽,不然報錯

def wrapper(func):
    def inner(*args,**kwargs):
        if not session.get("user_info"):
            return redirect("/login")
        ret = func(*args,**kwargs)
        return ret
    return inner

@app.route("/login",methods=["GET","POST"])  # 指定該路由可接收的請求方式,默認爲GET
def login():
    if request.method=="GET":
        return render_template("login.html")
    else:
        # print(request.values)   #這個裏面什麼都有,至關於body
        username = request.form.get("username")
        password = request.form.get("password")
        if username=="haiyan" and password=="123":
            session["user_info"] = username
            # session.pop("user_info")  #刪除session
            return redirect("/index")
        else:
            # return render_template("login.html",**{"msg":"用戶名或密碼錯誤"})
            return render_template("login.html",msg="用戶名或者密碼錯誤")

@app.route("/index",methods=["GET","POST"])
@wrapper    #本身定義裝飾器時,必須放在路由的裝飾器下面
def index():
    # if not session.get("user_info"):
    #     return redirect("/login")
    return render_template("index.html")


if __name__ == '__main__':
    app.run(debug=True) 

debug = True 是指進入調試模式,服務器會在 咱們的代碼修改後, 自動從新載入,有錯誤的話會提醒,每次修改代碼後就不須要再手動重啓

4.請求響應相關

1.獲取請求數據,及相應

    - request
            - request.form   #POST請求的數據
            - request.args   #GET請求的數據,不是徹底意義上的字典,經過.to_dict能夠轉換成字典
            - request.querystring  #GET請求,bytes形式的
        - response
            - return render_tempalte()    
            - return redirect()
            - return ""
            v = make_response(返回值)  #能夠把返回的值包在了這個函數裏面,而後再經過.set_cookie綁定cookie等
        - session
            - 存在瀏覽器上,而且是加密的
            - 依賴於:secret_key

2.flask中獲取URL後面的參數

(from urllib.parse import urlencode,quote,unquote)

GET請求:

URL爲:  http://127.0.0.1:5000/login?name=%27%E8%83%A1%E5%86%B2%27&nid=2

from urllib.parse import urlencode,quote,unquote

def login():
    if request.method == 'GET':
        s1 = request.args
        s2 = request.args.to_dict()
        s3 = urlencode(s1)
        s4 = urlencode(s2)
        s5 = unquote(s3)
        s6 = unquote(s4)
        s7 = quote("胡衝")
        print('s1',s1)
        print('s2',s2)
        print('s3',s3)
        print('s4',s4)
        print('s5',s5)
        print('s6',s6)
        print('s7',s7)

        return render_template('login.html')

#############結果以下####################

s1 ImmutableMultiDict([('name', "'胡衝'"), ('nid', '2')])
s2 {'name': "'胡衝'", 'nid': '2'}
s3 name=%27%E8%83%A1%E5%86%B2%27&nid=2
s4 name=%27%E8%83%A1%E5%86%B2%27&nid=2
s5 name='胡衝'&nid=2
s6 name='胡衝'&nid=2
s7 %E8%83%A1%E5%86%B2

 

原文連接:

https://www.cnblogs.com/huchong/p/8227606.html

 


Flask快速入門,知識整理

識別圖中二維碼,領取python全套視頻資料

相關文章
相關標籤/搜索