flask(一)

一.python現階段三大主流框架Django Tornado Flask的對比

特色:
1.Django的特色是大而全,集成了不少組件,屬於全能型框架
2.tornado的主要特色是原生異步非阻塞,在IO密集型和多任務處理上佔有絕對優點,屬於專一型框架
3.flask的的特色是小而輕,原生組件幾乎爲0
​
使用類型:
1.Django適用於大型的web應用,因爲內部的組件足夠強大,可使開發一鼓作氣
2.tornado適用於api後端應用,常服務於遊戲後臺,由於內部的異步非阻塞很是穩
3.簡單的應用用flask很是簡潔,大型的應用Django和flask均可以
​
缺點:
1.djnago的缺點是資源一次性所有加載,會形成資源浪費
2.tornado太乾淨了,連個session都不支持
3.flask相對不妥當,因爲依賴第三方

 

二.下載

pip3 install flask

第三方組件:http://flask.pocoo.org/html

 

三.簡單實現

1.三行啓動flask

from flask import Flask ,jsonify
app = Flask(__name__)
app.run(debug=True)

 

2.六行帶視圖函數

from flask import Flask  #導入flask類
app = Flask(__name__)  #實例化一個flask對象app
​
@app.route("/")  #router裝飾器
def index():  #視圖函數
    return "aaa"
​
app.run("0.0.0.0",5000,debug=True)  #啓動flask web應用

 

四.Flask中的Render Redirect HttpResponse

1.Flask中的HttpResponse其實 就是直接返回字符串前端

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

 

2.Flask中的Redirect python

from flask import Flask,redirect
​
app = Flask(__name__)
​
@app.route("/")
def index():
    return redirect("/index") #在訪問"/"時,重定向到"/index"
​
@app.route("/index")
def index1():
    return "重定向"
​
app.run("0.0.0.0",5000,debug=True)

 

3.Flask中的renderweb

from flask import Flask,render_template
​
app = Flask(__name__)
​
@app.route("/index")
def index1():
    return render_template('index.html')
​
app.run("0.0.0.0",5000,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
</body>
</html>

 

4.除Render Redirect HttpResponse外,Flask特有的jsonify與senf_filejson

(1)jsonify(與json.dumps不一樣的是會有請求頭application/json)flask

from flask import Flask,render_template,jsonify
​
app = Flask(__name__)
​
@app.route("/")
def index1():
    return jsonify({"aa":1})
​
app.run("0.0.0.0",5000,debug=True)

 

(2)send_file後端

from flask import Flask,render_template,send_file
​
app = Flask(__name__)
​
@app.route("/")
def index1():
    name="shy"
    return send_file("dvd.mp4")
​
app.run("0.0.0.0",5000,debug=True)

 

send_file能夠返回文字,文件,圖片,視頻等等,自動識別文件是什麼類型的文件,在Content-Type:後加文件類型api

 

五.八種請求方式

get post delete put
option trace connnect head

 

methods參數安全

from flask import Flask,render_template,send_file
app = Flask(__name__)
​
@app.route("/",methods=["POST"])#規定了methods參數後,其餘請求就沒法訪問該視圖函數
def index1():
    name="shy"
    return send_file("dvd.mp4")
​
app.run("0.0.0.0",5000,debug=True)

 

六.request的使用(公共變量)

request.method:獲取請求方式的名字
​
request.form:存放formdata中的數據(前端中表單中的數據)
​
request.args:獲取url中的數據 如:ImmutableMultiDict([('a', '1')]),能夠to_dict()轉化成字典
​
request.url:訪問的完整路徑 如:http://127.168.13.61:5000/?a=1
​
request.path:路由地址 如:/index
​
request.host:主機地址 如:127.168.13.61:5000
​
request.host-url:http+主機地址 如:http://127.168.13.61:5000/index
​
request.json:若是請求頭中的contentType:aplication/json,直接序列化
​
request.data:若是請求頭中的contentType:aplication/dfsg,不知道怎麼序列化時沒法被識別,請求體中的原始數據放到這
​
request.values:用於查看數據一般不用來獲取數據 如:CombinedMultiDict([ImmutableMultiDict([('a', '1')]), ImmutableMultiDict([])])
​
request.files:獲取文件信息
​
request.cookies:獲取cookie中的數據
​
request.headers:獲取請求頭

 

注:to_dict方法cookie

to_dict方法:相似這樣ImmutableMultiDict,CombinedMultiDict,像字典同樣的數據類型,均可以使用to_dict方法,request.values.to_dict():會出現覆蓋問題

 

 

七.jinja2語法(與template幾乎如出一轍!!!)

1.引用變量(字典的傳遞)

from flask import Flask,redirect,render_template,request
​
app = Flask(__name__)
​
STUDENT = {'name': 'Old', 'age': 38, 'gender': ''}
​
@app.route("/login",methods=["GET","POST"])
def login():
    print(request.form)
    if request.method=="GET":
        return render_template('login.html')
    if request.form.get("username")=="aaa" and request.form.get("password")=="111":
        return redirect('/index')
    else:
        return "登陸失敗"
@app.route("/index")
def index():
    return render_template('index.html',stu=STUDENT)
​
app.run("0.0.0.0",5002,debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
學生信息{{ stu }}
<table>
    <tr>
        <td>{{ stu.name }}</td>
        <td>{{ stu.age }}</td>
        <td>{{ stu.gender }}</td>
    </tr>
    <tr></tr>
</table>
</body>
</html>

 

2.邏輯代碼(列表的傳遞)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
學生信息{{ stu }}
<table>
    <tr>
        <td>{{ stu.name }}</td>
        <td>{{ stu.age }}</td>
        <td>{{ stu.gender }}</td>
    </tr>
    {% for foo in lis %}
    <tr>
    <td>{{ foo.name }}</td>
    <td>{{ foo.age }}</td>
    <td>{{ foo.gender }}</td>
    </tr>
    {% endfor %}
​
​
</table>
</body>
</html>

 

3.Markup的使用(至關於 |safe,安全標籤字符串)(標籤字符串的傳遞)

from flask import Flask,redirect,render_template,request,Markup
​
app = Flask(__name__)
##############################
word="<p>hahaha</p>"
word1=Markup(word)
##############################
@app.route("/login",methods=["GET","POST"])
def login():
    print(request.form)
    if request.method=="GET":
        return render_template('login.html')
    if request.form.get("username")=="aaa" and request.form.get("password")=="111":
        return redirect('/index')
    else:
        return "登陸失敗"
@app.route("/index")
def index():
    return render_template('index.html',stu=STUDENT,lis=STUDENT_LIST,word=word1)
​
app.run("0.0.0.0",5002,debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
##########################
{{ word }}
##########################
</body>
</html>

 

4.函數的傳遞

(1)單個函數的傳遞

from flask import Flask,redirect,render_template,request,Markup
​
app = Flask(__name__)
​
def add(a,b):
    return a+b
​
@app.route("/login",methods=["GET","POST"])
def login():
    print(request.form)
    if request.method=="GET":
        return render_template('login.html')
    if request.form.get("username")=="aaa" and request.form.get("password")=="111":
        return redirect('/index')
    else:
        return "登陸失敗"
@app.route("/index")
def index():
    return render_template('index.html',func=add)
​
app.run("0.0.0.0",5002,debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
學生信息{{ stu }}
{{ func(1,2) }}
</body>
</html>

 

(2)template_global,若是數量多的話,變成全局均可以使用的函數

from flask import Flask,redirect,render_template,request,Markup
​
app = Flask(__name__)
​
#############################
@app.template_global()#template_global是一個特殊的裝飾器
def add(a,b):
    return a+b
##############################
​
@app.route("/login",methods=["GET","POST"])
def login():
    print(request.form)
    if request.method=="GET":
        return render_template('login.html')
    if request.form.get("username")=="aaa" and request.form.get("password")=="111":
        return redirect('/index')
    else:
        return "登陸失敗"
@app.route("/index")
def index():
    return render_template('index.html')
​
app.run("0.0.0.0",5002,debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
學生信息{{ stu }}
{{ add(2,2) }}
</body>
</html>

 

(3)能夠傳遞參數的全局函數

from flask import Flask,redirect,render_template,request,Markup
​
app = Flask(__name__)
​
@app.template_filter()
def fil(a,b,c):
    return a+b+c
​
@app.route("/login",methods=["GET","POST"])
def login():
    print(request.form)
    if request.method=="GET":
        return render_template('login.html')
    if request.form.get("username")=="aaa" and request.form.get("password")=="111":
        return redirect('/index')
    else:
        return "登陸失敗"
@app.route("/index")
def index():
    return render_template('index.html')
​
app.run("0.0.0.0",5002,debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
學生信息{{ stu }}
{{ 1 |fil(2,3) }}
</body>
</html>

 

5.宏macro

from flask import Flask,redirect,render_template,request,Markup
​
app = Flask(__name__)
​
@app.route("/login",methods=["GET","POST"])
def login():
    print(request.form)
    if request.method=="GET":
        return render_template('login.html')
    if request.form.get("username")=="aaa" and request.form.get("password")=="111":
        return redirect('/index')
    else:
        return "登陸失敗"
@app.route("/index")
def index():
    return render_template('index.html')
​
app.run("0.0.0.0",5002,debug=True)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>這是index.html</div>
學生信息{{ stu }}
#################定義宏#####################
{% macro create_input(na,ty) %}
用戶名:{{ na }}<input type="{{ ty }}" name="{{ na }}">
{% endmacro %}
##################給宏傳值#####################
{{ create_input("username","text") }}
</body>
</html>

 

 

八.session(公共變量)

from flask import session
app = Flask(__name__)
app.secret_key = "DragonFire"  #用來加密的字符串

 

設置session

session["username"]="shy"

 

獲取session

session.get("username")#若是出現KeyError,說明沒有這個key的session

session機制:flask中的session是存儲在cookie中的,爲了節省flask的開銷

相關文章
相關標籤/搜索