天天看點

初識Flask一、Flask的基本介紹二、初始Flask

一、Flask的基本介紹

Flask是一個微型的小而精的Web架構,可擴充性強,内置的元件很少,需要引入第三方元件實作功能業 務,如果開發簡單的項目,使用Flask比較快速和友善。如果開發大型項目,需要引入大量的第三方元件,這時Flask會越來越像Django架構。基于wsgi協定部署,使用werkzeug子產品實作此協定,模闆系統由 Jinja2提供。

“微”(micro) 并不表示你需要把整個 Web 應用塞進單個 Python 檔案(雖然确實可以 ),也不意味着 Flask 在功能上有所欠缺。微架構中的“微”意味着 Flask 旨在保持核心簡單而易于擴充。Flask 不會替你做出太多決策——比如使用何種資料庫。而那些 Flask 所選擇的——比如使用何種模闆引擎——則很容易替換。除此之外的一切都由可由你掌握。如此,Flask 可以與您珠聯璧合。

預設情況下,Flask 不包含資料庫抽象層、表單驗證,或是其它任何已有多種庫可以勝任的功能。然而,Flask 支援用擴充來給應用添加這些功能,如同是 Flask 本身實作的一樣。衆多的擴充提供了資料庫內建、表單驗證、上傳處理、各種各樣的開放認證技術等功能。Flask 也許是“微小”的,但它已準備好在需求繁雜的生産環境中投入使用。

二、初始Flask

1. 三行代碼啟動一個flask服務

from flask import Flask
app = Flask(__name__)
app.run()
           

僅僅需要三行代碼就可以啟動一個flask服務,對于Django,是完全不能做到的。

2. 六行代碼實作一個"hello world".

from flask import Flask
app = Flask(__name__)

@app.route("/home")
def func():
    return "hello world"
app.run()
           

通過看flask中route的源碼了解到上面的例子還可以這樣寫

from flask import Flask

app = Flask(__name__)

def func():
    return "hello world"

app.add_url_rule("/home", view_func=func)
app.run()
           

3. 請求方式:

from flask import Flask, request

app = Flask(__name__)

@app.route("/home", methods=("GET", "POST"))
def func():
    if request.method == "GET":
        return "GET請求"
    if request.method == "POST":
        return "POST請求"

app.run()
           

request 與 Django 的不太一樣,通過導入的方式使用

from flask import request

4. Flask響應三劍客

  • return "字元串" 響應字元串
  • render_template("xx.html") 響應html頁面
  • redirect("/index") 重定向
from flask import Flask, request, render_template, redirect, Markup

app = Flask(__name__)


@app.route("/home", methods=("GET", "POST"))
def func():
    if request.method == "GET":
        return render_template(
             "./home.html", 
              msg=Markup("<i>我是參數,Markup的作用是不讓浏覽器轉義</i>"))   //響應html頁面
    if request.method == "POST":
        return redirect("/index")    //響應重定向


@app.route("/index")
def index():
    return "我是index界面的内容"    //響應字元串

app.run()
           

home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>我是POST請求</h1>
<h3>我是參數:<br> {{ msg }}</h3>

<form action="" method="post">
    使用者:<input type="text" name="username">
    <input type="submit" value="點我送出">
</form>

</body>
</html>
           

5. 解析request中的屬性

ps:補充一下相關知識點:_dict_與dir()的差別:

    1. 執行個體的dict僅存儲與該執行個體相關的執行個體屬性
    1. dir()是Python提供的一個API函數,dir()函數會自動尋找一個對象的所有屬性(包括從父類中繼承的屬性)。
    1. 一個執行個體的dict屬性僅僅是那個執行個體的執行個體屬性的集合,并不包含該執行個體的所有有效屬性。是以如果想擷取一個對象所有有效屬性,應使用dir()。
    1. dir()函數會自動尋找一個對象的所有屬性,包括dict中的屬性。dict是dir()的子集,dir()包含dict中的屬性。

通過列印request對象的_dir_()或者dir()方法,我們可以得到request對象及其父類中的所有屬性

request-----> ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', 
'__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', 
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'__weakref__', '_cached_json', '_get_data_for_json', '_get_file_stream', 
'_get_stream_for_parsing', '_load_form_data', '_parse_content_type', 'accept_charsets', 
'accept_encodings', 'accept_languages', 'accept_mimetypes', 'access_route', 'application', 
'args', 'authorization', 'base_url', 'blueprint', 'cache_control', 'charset', 'close', 
'content_encoding', 'content_length', 'content_md5', 'content_type', 'cookies', 'data', 'date', 
'dict_storage_class', 'disable_data_descriptor', 'encoding_errors', 'endpoint', 'environ', 'files', 
'form', 'form_data_parser_class', 'from_values', 'full_path', 'get_data', 'get_json', 'headers', 
'host', 'host_url', 'if_match', 'if_modified_since', 'if_none_match', 'if_range', 
'if_unmodified_since', 'input_stream', 'is_json', 'is_multiprocess', 'is_multithread', 'is_run_once', 
'is_secure', 'is_xhr', 'json', 'list_storage_class', 'make_form_data_parser', 
'max_content_length', 'max_form_memory_size', 'max_forwards', 'method', 'mimetype', 
'mimetype_params', 'on_json_loading_failed', 'parameter_storage_class', 'path', 'pragma', 
'query_string', 'range', 'referrer', 'remote_addr', 'remote_user', 'routing_exception', 'scheme', 
'script_root', 'shallow', 'stream', 'trusted_hosts', 'url', 'url_charset', 'url_root', 'url_rule', 
'user_agent', 'values', 'view_args', 'want_form_data_parsed']
           

這麼多的屬性難道我們都需要記住嗎???當然不,挑挑重要的吧!

request.path // route("/home")

request.url // 全url("http://127.0.0.1:5000/home")

request.data //request解不了的資料全放這裡

request.json //傳過來的資料是application/json時放在這裡

request.form //form表單傳過來的資料

request.args //擷取url上的參數

request.values //request.form和request.args的資料組,常用于測試

6. Jinja2的使用

inja2 與 Django 的template 極為相似,文法更貼切Python,學起來很簡單

    1. {{ }} 引用變量及函數
    1. {% %} 有邏輯代碼
    1. 不讓浏覽器轉移html代碼-->後端:Markup() 前端: | safe
    1. @app.template_global() 定義全局使用的函數
@app.template_global()
def add_sum(*args):
    return sum(args)
           
    1. @app.template_filter() 過濾
@app.template_filter()
def oushu(sum):
    if not sum % 2:
        return "偶數"
    else:
        return "奇數"
           

前端使用示例:

<p>{{ add_sum(23,6,1234,523,567,34136,132,6,25) | oushu }}</p>
           
    1. extends 繼承母版
    1. block 母版中定義代碼塊
    1. include 元件

jianja2的使用和django的template的相關使用一樣,不累述,請參考:

https://www.jianshu.com/p/b23c77852e33
    1. macro的使用(了解)
{% macro create_tag(na,ty) %}
        <input type="{{ ty }}" name="{{ na }}" value="{{ na }}">
    {% endmacro %}
    <h1>你往下看</h1>
    {{ create_tag("pppssssss","submit") }}
           

7. session的使用

flask中的session 是存放在 浏覽器cookies中的session ,session值是加密序列化的字元串

  • Flask使用Session時同樣需要導入

    from flask import session

  • 當使用session存儲資料時如果報以下錯誤,在執行個體化Flask後設定秘鑰即可 app.secret_key = "加密字元串"就OK了!!!
    初識Flask一、Flask的基本介紹二、初始Flask
    image.png
  • session取值

    session["key"] = value