Flask快速上手

1、Flask的基本介紹

Flask是一個微型的小而精的Web框架,可擴展性強,內置的組件不多,須要引入第三方組件實現功能業 務,若是開發簡單的項目,使用Flask比較快速和方便。若是開發大型項目,須要引入大量的第三方組件,這時Flask會愈來愈像Django框架。基於wsgi協議部署,使用werkzeug模塊實現此協議,模板系統由 Jinja2提供。html

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

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

2、初始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()
# app.route("/home")的源碼分析
class Flask(_PackageBoundObject):
    def route(self, rule, **options):
        def decorator(f):
            endpoint = options.pop("endpoint", None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f
        return decorator

經過看flask中route的源碼瞭解到上面的例子還能夠這樣寫django

from flask import Flask

app = Flask(__name__)

def func():
    return "hello world"
# 在flask源碼中調用的就是add_url_rule方法,並把url和函數名傳進去
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 requestjson

4. Flask響應三劍客

  • return "字符串" 響應字符串
  • render_template("xx.html",a=b) 響應html頁面 , 參數須要用關鍵字傳參,固然也能夠**{a:b}打散
  • 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.htmlflask

<!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()的區別:
  • 實例的_dict_僅存儲與該實例相關的實例屬性
  • dir()是Python提供的一個API函數,dir()函數會自動尋找一個對象的全部屬性(包括從父類中繼承的屬性)。
  • 一個實例的_dict_屬性僅僅是那個實例的實例屬性的集合,並不包含該實例的全部有效屬性。因此若是想獲取一個對象全部有效屬性,應使用dir()。
  • dir()函數會自動尋找一個對象的全部屬性,包括_dict_中的屬性。_dict_是dir()的子集,dir()包含_dict_中的屬性。
經過打印request對象的_dict_()或者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的數據組,經常使用於測試swift

6. Jinja2的使用

jinjia2與 Django 的template 極爲類似,語法更貼切Python,學起來很簡單後端

  • {{ }} 引用變量及函數
  • {% %} 有邏輯代碼
  • 不讓瀏覽器轉移html代碼-->後端:Markup() 前端: | safe
  • @app.template_global() 定義全局使用的函數
@app.template_global()
def add_sum(*args):
    return sum(args)


@app.route("/home")
def home():
    return render_template("./home.html")

@app.route("/index")
def index():
    return render_template("./index.html") 

# 有了加了@app.template_global()裝飾器的函數就至關於給home和index函數的render_template傳了一個關鍵字傳參add_sum=add_sum,
# 若是在app中就至關於 它給全部的視圖(包括藍圖中的藍圖)都加了add_sum=add_sum
# 若是是在藍圖中,就至關於給當前的藍圖的全部視圖加 add_sum=add_sum
# 藍圖的概念在後面的博客會介紹
  • @app.template_filter() 過濾
@app.template_filter()
def even(sum,zcy):
    """sum是'|'符號前傳過來的值,zcy是':'符號後面傳過來的值 """
    if not sum % 2:
        return "偶數"
    else:
        return "奇數"
    print(zcy)

前端使用示例:瀏覽器

<p>{{ add_sum(23,6,1234,523,567,34136,132,6,25) | even:'就想告訴你還能夠給過濾器傳參數' }}</p>
  • extends 繼承母版
  • block 母版中定義代碼塊
  • include 組件

jianja2的使用和django的template的相關使用同樣,不累述

  • 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了!!!

    img

  • session取值
    session["key"] = value

相關文章
相關標籤/搜索