Python--Flask之Web框架1
一.基本知識瞭解
#1. 匯入Flask類; from flask import Flask #2. 例項化一個Flask物件, app = Flask(__name__) #3-1.基本路由:通過路由繫結一個檢視函式 #@app.route('/'): 告訴Flask哪個URL才能出發對應的函式, 又稱為路由; #對應定義了一個檢視函式, 也就是返回給使用者瀏覽器顯示的內容; # http://www.westos.org/login/ @app.route('/') def index(): return "<h1>hello world</h1>" @app.route('/login/') def login(): return "login" #4. 執行Flask應用, 可以指定ip和埠; # '0.0.0.0' 所有的IP都可以訪問到; app.run('0.0.0.0', 9000)
二 路由與變數規則
常見路由規則:
1). url的一部分可以標記為變數<變數名>
2). flask中路由裡面的變數常見型別:int,string,float,path,uuid
from flask import Flask app=Flask(__name__) @app.route('/<int:id>/comments/') def index(id): return '%s index' %(id) @app.route('/welcome/<string:user>/') def welcome(user): return 'welcome %s' %(user) app.run()
三 URL構建與反向URL
from flask import Flask, request, url_for app = Flask(__name__) @app.route('/welcome/<string:user>/') def welcome(user): return user + "使用者, 歡迎來到westos" @app.route('/path/') def path(): print(request.headers) print(request.method) # url_for: 根據函式名, 反向生成url地址 print("使用者正在訪問url地址:%s" % (url_for(endpoint="welcome", user="westos"))) return "使用者正在訪問url地址:%s" % (url_for(endpoint="welcome", user="westos")) app.run()
注意:
1).通過 url_for ,根據函式名,反向構建URL
2).通過 request類,可以得到其頭部資訊或者訪問模式,是 get 或者 post 等
常見get和post方法
from os import abort
from flask import Flask, render_template, request, redirect, url_for
app=Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method=='POST':
print(request.form)
#1.如何獲取到使用者提交的資訊
user=request.form['user']
passwd=request.form['passwd']
#2.判斷使用者名稱和密碼是否正確
if user=='root' and passwd=='westos':
#如果登陸成功,跳轉到主頁
return redirect(url_for('index'))
else:
#如果登入失敗,重新登陸
return render_template('login.html')
else:
#使用者是GET請求,返回的是登陸的html頁面
#1.讀取lohin.html檔案的內容
#2.將讀取的內容返回給使用者介面
return render_template('login.html')
#404異常處理:類似於捕獲異常
@app.errorhandler(404)
def not_found(e):
return render_template('404.html')
#丟擲異常
@app.route('/user/<int:user_id>/')
def user(user_id):
if 0<int(user_id)<=100:
return '歡迎訪問:%s' %(user_id)
else:
abort(404)
app.run(port=5003)
常見的HTTP請求方法:
GET:
1). 獲取資訊
2). 提交的資訊會展示在url: http://www.wewtos.org/login?user=westos&passwd=westos
POST:
1). 提交資訊
2). 不在url裡面展示, 有利於資料的安全性
預設路由的接受請求方法為:__ get __
如何指定接收多個HTTP請求方法?
@app.route('/login/', methods=['GET', 'POST'])
request類的一些用法,如何判斷使用者請求的HTTP方法?
request.method()
如何獲取使用者POST請求提交的表單資料?
request.form()
四 模版渲染
Flask自帶的模版引擎:jinjia2
在html檔案中通過動態賦值 將重新翻譯好的html檔案(模板引擎生效) 返回給使用者的過程
python的Web開發中, 業務邏輯(實質就是檢視函式的內容)和頁面邏輯(html檔案)分開的, 使得程式碼的可讀性增強, 程式碼容易理解和維護
python中生成html不易修改與維護, 所以將html的內容獨立到templates目錄中
1).去當前專案目錄下尋找templtes是否存在?再去判斷templates目錄下是否有login.html檔案?
2). 讀取這個login.html檔案的內容, 作為render_template的返回值;
3). 最終返回給使用者瀏覽器:render_template(‘login.html’)
重定向和錯誤提示
1).運用redirect重新定向 html頁面
運用render_template重新渲染html頁面
2).錯誤提示:
render_template('login.html', message="使用者名稱或者密碼錯誤")
運用 jinjia2 通過後臺向前臺提示資訊,資訊內容為 message=“使用者名稱或者密碼錯誤”
404報錯處理
當訪問頁面錯誤時,通過@app.errorhandler(404)自定義404錯誤
再通過重定向訪問404專屬頁面
五 變數的顯示
通過 jinjia2 的變數規則來顯示一些變數
包含(字串、列表、字典和類)
from flask import Flask,render_template
app=Flask(__name__)
class User(object):
def __init__(self,name,passwd):
self.name=name
self.passwd=passwd
def __str__(self):
return 'User : %s' %(self.name)
@app.route('/')
def muban():
name='hello world'
li=[1,2,3,4]
d=dict(a=1,b=2)
u=User('westos','passwd')
return render_template('hello.html',
name=name,
li=li,
d=d,
u=u
)
app.run()
hello.html 頁面內容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
變數:{{name}}
<br>列表:{{li}}
{% for i in li %}
<br>列表元素顯示:{{i}}
{% endfor %}
<br>字典:{{d}}
<br>字典元素顯示:{{d.a}}
<br>字典元素顯示:{{d['b']}}
<br>物件:{{u}}
<table>
<tr>
<th>使用者名稱</th>
<th>密碼</th>
</tr>
<tr>
<td>{{u.name}}</td>
<td>{{u.passwd}}</td>
</tr>
</table>
</body>
</html>
六 過濾器與自定義過濾器
import time
from flask import Flask, render_template
app = Flask(__name__)
class User(object):
def __init__(self, name, passwd):
self.name = name
self.passwd = passwd
def __str__(self):
return "<User: %s>" % (self.name)
# 自定義一個轉換時間格式的過濾器
@app.route('/')
def index2():
name = " this is a message"
li = [1, 2, 4, 5]
d = dict(a=1, b=2)
liDict = [
{
'count': 100,
'price': 30
},
{
'count': 110,
'price': 20
},
]
u = User("westos", "passwd")
timestamp = time.time()
return render_template('index2.html',
name=name,
li=li,
d=d,
u=u,
liDict=liDict,
timestamp=timestamp
)
def format_date(value, format="%Y-%m-%d %H:%M:%S"):
# 時間戳----> 元組
ttime = time.localtime(value)
# 元組 --- > 指定字串
return time.strftime("%Y-%m-%d %H:%M:%S", ttime)
app.add_template_filter(format_date, 'format_date')
@app.route('/index3/')
def index3():
return render_template('index3.html',
timestamp=time.time())
app.run(port=5007)
index2.html頁面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--/*什麼是過濾器?-->
<!--實質上就是一個轉換函式/方法-->
{{ timestamp }}
{{ timestamp | format_date }}
<!--/*常見的字串過濾器操作:*/-->
<ul>
<li>{{ name | upper }}</li>
<li>{{ name | lower }}</li>
<li>{{ "hello" | capitalize }}</li>
<li>{{ " hello world" | capitalize }}</li>
<li>{{ name | reverse }}</li>
</ul>
<!--/*常見數值操作*/-->
<ul>
<!--四捨五入-->
<li>{{ -12.9623423435 | round }}</li>
<li>{{ -12.9623423435 | round | abs }}</li>
</ul>
<!--/*列表常見:*/-->
<ul>
<li>{{ li }}</li>
<li>{{ li | first }}</li>
<li>{{ li | last }}</li>
<li>{{ li | length }}</li>
<li>{{ li | sum }}</li>
<li>{{ li | sort | reverse }}</li>
<li>{{ li | join(":") }}</li>
<li>{{ ["hello", "world"] | upper}}</li>
<li>{{ ["hello", "woHld"] | lower}}</li>
</ul>
<!--/*列表包含字典常用操作:*/-->
<ul>
{% for item in liDict | sort(attribute='price', reverse=false) %}
{{ item }}
{% endfor %}
</ul>
</body>
</html>
七 模版的繼承
如何繼承某個模版
{% extends "模板名稱" %}
如何挖坑和填坑
挖坑:
{% block 名稱 %}
預設值
{% endblock %}
填坑:
{% block 名稱 %}
程式碼內容
{% endblock %}
如何呼叫/繼承被替代的模板
挖坑:
{% block 名稱 %}
預設值
{% endblock %}
挖坑:
{% block 名稱 %}
#如何繼承挖坑時的預設值?
{{ super() }}
#後面寫新加的方法.
........
{% endblock %}
八 巨集macro的使用
定義marco.html
{% macro 函式名(變數)%}
html程式碼樣(包含需要替換的變數)
{% endmacro %}
可以改寫包含此巨集的html