1 視圖傳遞多個參數 (1) 普通傳參 : 關鍵字參數傳遞 (2) 字典傳參 : 以字典的形式傳遞 (3) 全局變數g傳遞 視圖中: 模板中 (4) 傳遞全部的本地變數給template,使用 locals() ,直接獲取變數值 test.html中 2 錯誤頁面定製 指定錯誤頁面:只需要一個錯誤模 ...
1 視圖傳遞多個參數
(1) 普通傳參 : 關鍵字參數傳遞
return render_template('模板名稱.html',arg1=val1,arg2=val2...)
(2) 字典傳參 : 以字典的形式傳遞
dict = {
key1:value1,
key2:value2,
....
}
return render_template('模板名稱.html',dict)
(3) 全局變數g傳遞
視圖中:
@app.route('/test')
def test():
g.name = '張三'
g.sex = '男'
return render_template('test.html')
模板中
<h2>{{ g.name }}</h2>
<h2>{{ g.sex }}</h2>
(4) 傳遞全部的本地變數給template,使用locals()**,直接獲取變數值
@app.route('/test')
def test():
name = '張三'
sex = '男'
return render_template('test.html',**locals())
test.html中
<h2>{{ name }}</h2>
<h2>{{ sex }}</h2>
2 錯誤頁面定製
#制定捕獲404和500的錯誤頁面
@app.errorhandler(404)
def page_not_found(e):
return render_template('error.html',error=e,code=404)
@app.errorhandler(500)
def page_not_found(e): #接受參數e,並傳給錯誤error
return render_template('error.html',error=e,code=500)
指定錯誤頁面:只需要一個錯誤模板頁面即可
{% extends 'common/boot_base.html' %}
{% block title %}
{{ code }} #標題顯示500
{% endblock %}
{% block page_content %}
<div class="alert alert-danger" role="alert">{{ error }} #顯示錯誤頁面信息
</div>
{% endblock %}
3 文件上傳
(1) 靜態資源的載入
{{ url_for('static',filename='img/mei.jpg') }}
{{ url_for('static',filename='css/style.css') }}
{{ url_for('static',filename='js/mei.js') }}
#註:static是內置的視圖函數,我們通過其找到路由
(2) 原生文件上傳
模板文件
{% if newName %} #newName非空 圖片名傳入
<img src='{{ url_for("static",filename=newName) }}' alt=''>
{% endif %}
#視圖函數upLoad
<form action="{{ url_for('upLoad') }}" enctype='multipart/form-data' method='post'>
<input type='file' name='file'>
<p><input type='submit' value='submit'></p>
</form>
主文件manage.py
from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
import os
from PIL import Image #python圖片處理庫
app = Flask(__name__)
#允許上傳的尾碼名,放在配置文件
app.config['ALLOWED_EXTENSIONS'] = ['.jpg','.jpeg','.png','.gif']
#上傳文件的大小
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*60
#配置文件上傳的路徑
app.config['UPLOAD_FOLDER'] = os.getcwd() + '/static'
#綁定bootstrap
bootstrap = Bootstrap(app)
manager = Manager(app)
@app.route('/')
def index():
return render_template('index.html')
#生成隨機圖片名稱的函數
def new_name(shuffix,length=32):
import string,random
myStr = string.ascii_letters + '0123456789'
newName = ''.join(random.choice(myStr) for i in range(length))
return newName+shuffix
#定義判斷尾碼是否可用函數,返回true/false
def allowed_file(shuffix):
return shuffix in app.config['ALLOWED_EXTENSIONS']
@app.route('/upload',methods=['GET','POST'])
def upload():
img_name = None
if request.method == 'POST':
file = request.files.get('file')
#獲取上傳文件的名稱
filename = file.filename
#分割路徑,返迴路徑名和文件擴展名的元組
shuffix = os.path.splitext(filename)[-1]
if allowed_file(shuffix):
#為真則生成隨機名稱
newName = new_name(shuffix)
img_name = newName
#拼湊完整的路徑
newPath = os.path.join(app.config['UPLOAD_FOLDER'],newName)
file.save(newPath)
#處理圖片的縮放
img = Image.open(newPath)
#重新設置大小與尺寸
img.thumbnail((200,200))
img.save(newName)
#跳轉上傳頁面並返回newName
return render_template('upload.html',newName=img_name)
4 flask-uploads擴展庫
安裝
pip3 install flask-uploads
類UploadSet : 文件上傳配置集合,包含三個參數:
name:文件上傳配置集合的名稱,預設files
extensions:上傳文件類型,預設DEFAULTS = TEXT + DOCUMENTS + IMAGES + DATA
default_dest:上傳文件的預設存儲路徑,我們可以通過app.config[‘UPLOADS_DEFAULT_DEST’]來指定
方法 : configure_uploads
應用配置好之後,調用此方法,掃描上傳配置選項並保存到我們的應用中,註冊上傳模塊。
下麵我們來看下 (flask-uploads庫 + flask-wtf 庫) 的寫法
模板文件
{% extends 'common/base.html' %} #繼承
{% block title %}
首頁
{% endblock %}
{% import 'bootstrap/wtf.html' as wtf %} #導入
{% block page_content %}
<img src="{{ url_for('static',filename=newName) }}" alt="">
{{ wtf.quick_form(form) }} #快速渲染
{% endblock %}
主啟動文件
from flask import Flask,render_template,request
from flask_script import Manager
from flask_bootstrap import Bootstrap
import os
from flask_uploads import UploadSet,IMAGES,configure_uploads,patch_request_class
#導入庫中驗證的欄位類
from flask_wtf import FlaskForm
from wtforms import FileField,SubmitField
from flask_wtf.file import FileAllowed,FileRequired
app = Flask(__name__)
#允許上傳的尾碼
app.config['SECRET_KEY'] = 'image'
app.config['MAX_CONTENT_LENGTH'] = 1024*1024*64 #64兆
#配置文件上傳的路徑
app.config['UPLOADED_PHOTOS_DEST'] = os.getcwd()+'/static/upload'
#實例化一個file對象 photos與PHOTOS要對應
file = UploadSet('photos',IMAGES)
#將 app 的 config 配置註冊到 UploadSet 實例 file
configure_uploads(app,file)
#限制上傳文件的大小 size=None不採用預設size=64*1024*1024
patch_request_class(app,size=None)
bootstrap = Bootstrap(app)
manager = Manager(app)
class File(FlaskForm):
file = FileField('文件上傳',validators=[FileRequired(message='您還沒有選擇文件'),FileAllowed(file,message='只能上擦圖片')])
submit = SubmitField('上傳')
#生成隨機圖片名稱的函數
def new_name(shuffix,length=32):
import string, random
myStr = string.ascii_letters + '0123456789'
newName = ''.join(random.choice(myStr) for i in range(length))
return newName+shuffix
@app.route('/upload',methods=['GET','POST'])
def upload():
form = File()
img_url = None
#驗證數據
if form.validate_on_submit():
shuffix = os.path.splitext(form.file.data.filename)[-1]
newName = new_name(shuffix=shuffix)
file.save(form.file.data,name=newName)
img_url = file.url(newName)
return render_template('boot_upload.html',newName=img_url,form=form)
if __name__ == '__main__':
manager.run()
註意事項:
python 將app的config配置註冊到 UploadSet 實例file configure_uploads(app,file) 限制上傳文件的大小 patch_request_class(app,size=None) file = UploadSet('photos',IMAGES) 實例化file對象繼承了類中save() url() 內置方法 form = File() File類繼承自FlaskForm 可以利用flask-uploads庫進行驗證 , 採用類File取代原生的Form表單訪問通過 : 實例化form對象.欄位名.data 訪問欄位對象 實例化form對象.欄位名.data.屬性名 訪問欄位對象對應的屬性