Flask入門

Flask與Django對比 :
django:
  1. 大而全,admin, models, Formm, 中間件
  2. 一個框架解決全部問題
缺點:

1.一旦啓動,全部資源所有加載,用戶到的,浪費了。html

  1. 太大了,結構複雜
  2. 全部組件,所有由Django自身控制
Flask:
  1. 輕,短小精悍
  2. 快,三行代碼開啓服務
缺點:
  1. 組件大部分來源域三方,flask-admin,flask-session
  2. flask 大版本更新組件,組件更新速度慢
Tornado
  1. 原生websocket
  2. 異步IO
  3. 非阻塞
  4. 原生SQL
缺點

三方以及原生組件,幾乎爲0前端

Flask開始使用
  1. 三行帥哥版
from flask import Flask  #導入flask

app = Flask(__name__)#實例化flask對象
app.run("0.0.0.0",5000,debug=True) #運行flask
  1. 六行上進青年版
from flask import Flask  #導入flask

app = Flask(__name__)   #實例化flask對象

@app.route("/")
def index():
    return "Hello world !"
    
app.run("0.0.0.0",5000,debug=True) 
  1. 精英版
from flask import Flask     #導入flask

app = Flask(__name__)       #實例化flask對象

@app.route("/")
def index():
    return "Heloo word !"

app.run("0.0.0.0",9527,debug=True)
網關接口流程
  • WSGI:
    • socket --- header :{http/1.1/r/nagent}
  • socket --- header : {http/1.1/r/nagent}
  • Django --- uwsgi
  • Flask --- Werkzenug
將請求頭作序列化
from werkzeug.wrappers import Request,Response

from werkzeug.serving import run_simple

@Request.application
def app(request):

    print(request)
    print(request.method)
    print(request.url)
    print(dir(request))
    
    return Response("OK!")

run_simple("0.0.0.0",8081,app)  #當請求進入服務的時候app + () 運行 
1 # 在flask中的HTTPResponse,在咱們看來其實就是直接返回字符串
2 
3 @app.route("/")     #app中的route裝飾器
4 def index():        #視圖函數
5     return "Hello world !"
Flask中HTTPResponse
from flask import Flask,redirect      #導入flask中的redirect

@app.route("/redi")             #app中的route裝飾器,用來指定視圖函數的URL地址
def redi(): #視圖函數
    return redirect("/")    #redirect跳轉至"/"
##當訪問"/redi"這個地址的時候,視圖函數redi會觸發redirect("/") 跳轉到url地址:  "/" 並會觸發"/"對應的視圖函數index()
Flask中的Redirect
from flask import render_template   #導入flask中的render_template

@app.route("/home")     #app中的route裝飾器,用來指定試圖函數的url地址
def home():     #home視圖函數
    return render_template("home.html")     #渲染HTML模版返回HTML頁面

HTML模板渲染是每一個Web框架中都必須有的,至於render_template的具體用法,留個懸念,日後看 python

注意: 若是要使用 render_template 返回渲染的模板,請在項目的主目錄中加入一個目錄 templatesweb

 

是時候開始寫個前端了,Flask中默認的模板語言是Jinja2 
如今咱們來一步一步的學習一下 Jinja2 捎帶手把 render_template 中留下的疑問解決一下 
首先咱們要在後端定義幾個字符串,用於傳遞到前端django

STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'},

STUDENT_LIST = [
    {'name': 'Old', 'age': 38, 'gender': '中'},
    {'name': 'Boy', 'age': 73, 'gender': '男'},
    {'name': 'EDU', 'age': 84, 'gender': '女'}
]

STUDENT_DICT = {
    1: {'name': 'Old', 'age': 38, 'gender': '中'},
    2: {'name': 'Boy', 'age': 73, 'gender': '男'},
    3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}

可是前提咱們要知道Jinja2模板中的流程控制: 
I. Jinja2模板語言中的 forflask

{% for foo in g %}

{% endfor %}

  

II. Jinja2模板語言中的 if後端

{% if g %}

{% elif g %}
    
{% else %}
    
{% endif %}

  

接下來,咱們對這幾種狀況分別進行傳遞,並在前端顯示成表格 websocket

  1. 使用STUDENT字典傳遞至前端 
    後端:
@app.route("/student")
def index():
    return render_template("student.html",student=STUDENT)

  

前端:session

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Old Boy EDU</title>
</head>
<body>
Welcome to Old Boy EDU
<div>{{ student }}</div>
<table border="1px">
    <tr>
        <td>{{ student.name }}</td>
        <td>{{ student["age"] }}</td>
        <td>{{ student.get("gender") }}</td>
    </tr>
</table>
</body>
</html>

  

說明:從這個例子中,能夠看出來,字典傳入前端Jinja2 模板語言中的取值操做, 與Python中的Dict操做極爲類似,而且多了一個student.name的對象操做 app

  1. STUDENT_LIST 列表傳入前端Jinja2 模板的操做:

  後端: 

@app.route("/student_list")
def student_list():
    return render_template("student_list.html",student=STUDENT_LIST)


前端: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Old Boy EDU</title>
</head>
<body>
Welcome to Old Boy EDU
<div>{{ student }}</div>
<table border="1xp">
    {% for foo in student %}
        <tr>
            <td>{{ foo }}</td>
            <td>{{ foo.name }}</td>
            <td>{{ foo.get("age") }}</td>
            <td>{{ foo["gender"] }}</td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

  

這裏咱們能夠看出若是是須要循環遍歷的話,Jinja2 給咱們的方案是

{% for foo in student %}
    <tr>
        <td>{{ foo }}</td>
    </tr>
{% endfor %}

  

上述代碼中的foo就是列表中的每個字典,再使用各類取值方式取出值便可。 

  1. STDENT_DICT大字典傳入前端Jinja2模版

 

後端:

@app.route("/student_dict")
def student_dict():
    return render_template("student_dict.html", student=STUDENT_DICT)


前端: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Old Boy EDU</title>
</head>
<body>
Welcome to Old Boy EDU
<table>
    {% for foo in student %}
        <tr>
            <td>{{ foo }}</td>
            <td>{{ student.get(foo).name }}</td>
            <td>{{ student[foo].get("age") }}</td>
            <td>{{ student[foo]["gender"] }}</td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

在遍歷字典的時候,foo 實際上是至關於拿出了字典中的Key 

  1. 結合全部的字符串兒所有專遞前端Jinja2 模板

後端: 

@app.route("/allstudent")
def all_student():
    return render_template("all_student.html", student=STUDENT ,
                           student_list = STUDENT_LIST,
                           student_dict= STUDENT_DICT)

前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Old Boy EDU</title>
</head>
<body>
<div> _____________________________________</div>
Welcome to Old Boy EDU : student
<div>{{ student }}</div>
<table border="1px">
    <tr>
        <td>{{ student.name }}</td>
        <td>{{ student["age"] }}</td>
        <td>{{ student.get("gender") }}</td>
    </tr>
</table>
<div> _____________________________________</div>
Welcome to Old Boy EDU : student_list
<div>{{ student_list }}</div>
<table border="1xp">
    {% for foo in student_list %}
        <tr>
            <td>{{ foo }}</td>
            <td>{{ foo.name }}</td>
            <td>{{ foo.get("age") }}</td>
            <td>{{ foo["gender"] }}</td>
        </tr>
    {% endfor %}
</table>
<div> _____________________________________</div>
Welcome to Old Boy EDU : student_dict
<div>{{ student_dict }}</div>
<table border="1xp">
    {% for foo in student_dict %}
        <tr>
            <td>{{ foo }}</td>
            <td>{{ student_dict.get(foo).name }}</td>
            <td>{{ student_dict[foo].get("age") }}</td>
            <td>{{ student_dict[foo]["gender"] }}</td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

這裏能夠看出來,render_template中能夠傳遞多個關鍵字

相關文章
相關標籤/搜索