Flask表單
Flask項目開發(fā)中針對提交表單的校驗搂蜓,可以使用Flask-WTF擴展庫進行快速的字段校驗
安裝Flask-WTF
pip install flask-wtf
定義form.py文件進行表單驗證
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, EqualTo
class UserRegisterForm(FlaskForm):
username = StringField('用戶名', validators=[DataRequired()])
password = StringField('密碼', validators=[DataRequired()])
password2 = StringField('確認密碼', validators=[DataRequired(), EqualTo('password', '密碼不一致')])
submit = SubmitField('提交')
定義注冊視圖函數
當HTTP請求為GET時狼荞,將表單驗證對象返回給頁面。
當HTTP請求為POST時帮碰,通過方法validate_on_submit()方法進行字段校驗和提交判斷相味,如果校驗失敗,則可以從form.errors中獲取錯誤信息殉挽。
如果驗證通過丰涉,則從form.字段.data中獲取到字段的值。
@blue.route('/register/', methods=['GET', 'POST'])
def register():
form = UserRegisterForm()
if request.method == 'GET':
return render_template('register.html', form=form)
if request.method == 'POST':
if form.validate_on_submit():
username = form.username.data
password = form.password.data
# 保存
user = User()
user.username = username
password = generate_password_hash(password)
user.password = password
user.save()
return '創(chuàng)建成功'
else:
return render_template('register.html', form=form)
使用表單后斯碌,會在模板中自動生成表單標簽
在括號中可以自定義屬性一死,包括type、style等
<h2>注冊</h2>
<form action="" method="post">
{{ form.csrf_token }}
{{ form.username.label }} : {{ form.username }} <br>
{{ form.password.label }} : {{ form.password(type='password') }} <br>
{{ form.password2.label }} : {{ form.password2(type='password') }} <br>
{{ form.submit }}
</form>
Flask文件上傳
模板定義
form表單中定義上傳文件的字段输拇,定義type='file'摘符。注意上傳的表單中一定要添加enctype="multipart/form-data"參數。
<form action="" method="post" enctype="multipart/form-data">
圖片: <input type="file" name="icon"><br>
<input type="submit" value="提交">
</form>
圖片保存
圖片的保存可以直接通過request.files獲取模板中上傳的圖片策吠,并調用save()方法進行保存逛裤。
@blue.route('/icon/', methods=['GET', 'POST'])
def icon():
if request.method == 'GET':
return render_template('icon.html')
if request.method == 'POST':
# 1.獲取圖片
icon = request.files.get('icon')
# 2.保存圖片
# path: E:/workspace/flask/day05/static/media/xxx.jpg
path = os.path.join(MEDIA_PATH, icon.filename)
icon.save(path)
# 3.修改字段
user = User.query.filter(User.username == 'aaa').first()
user.icon = icon.filename
user.save()
return redirect(url_for('user.index'))
圖片渲染
案例的場景是修改當前登錄系統(tǒng)用戶的icons字段,在模板中可以通過current_user參數獲取當前登錄系統(tǒng)的用戶對象猴抹,并訪問icons屬性即可獲取到存儲在數據庫中的圖片路徑带族。
<img src="/static/media/{{ user.icon }}" style="width: 500px">
項目結構
manage.py - 項目啟動
from flask_script import Manager
from utils.app import create_app
# 獲取flask對象app
app = create_app()
# 管理app
manage = Manager(app)
if __name__ == '__main__':
manage.run()
app.py - 初始化項目,加載配置蟀给,藍圖注冊
from flask import Flask
from utils.config import Conf
from app.views import blue
from app.models import db
from utils.settings import STATIC_PATH, TEMPLATE_PATH
def create_app():
app = Flask(__name__,
static_folder=STATIC_PATH,
template_folder=TEMPLATE_PATH)
# 加載配置
app.config.from_object(Conf)
# 藍圖
app.register_blueprint(blueprint=blue, url_prefix='/user')
# 初始化
db.init_app(app)
return app
config - 配置信息(鍵值對形式)
from utils.functions import get_sqlalchemy_uri
from utils.settings import DATABASE
class Conf():
SQLALCHEMY_DATABASE_URI = get_sqlalchemy_uri(DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
PRESERVE_CONTEXT_ON_EXCEPTION = False
SECRET_KEY = 'qwertyuiopasdfghjklzxcvbnm1234567890'
settings.py - 經常修改的詳細配置信息 - static蝙砌、templates、media等路徑的配置
import os
# 基礎路徑
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# static路徑
STATIC_PATH = os.path.join(BASE_DIR, 'static')
# templates路徑
TEMPLATE_PATH = os.path.join(BASE_DIR, 'templates')
# media路徑
MEDIA_PATH = os.path.join(STATIC_PATH, 'media')
DATABASE = {
'NAME': 'flask',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
'ENGINE': 'mysql',
'DRIVER': 'pymysql'
}
在functions.py文件中獲得mysql連接
def get_sqlalchemy_uri(DATABASE):
# mysql+pymysql://root:123456@127.0.0.1:3306/flask
user = DATABASE['USER']
password = DATABASE['PASSWORD']
host = DATABASE['HOST']
port = DATABASE['PORT']
name = DATABASE['NAME']
engine = DATABASE['ENGINE']
driver = DATABASE['DRIVER']
return f'{engine}+{driver}://{user}:{password}@{host}:{port}/{name}'
自定義狀態(tài)碼清單
USER_LOGIN_PARAMS_IS_INVALID = {'code': 10001, 'msg': '請?zhí)顚懲暾畔?}
USER_LOGIN_USERNAME_OR_PASSWORD_ERROR = {'code': 10002, 'msg': '用戶名或者密碼錯誤'}
SUCCESS = {'code': 200, 'msg': '請求成功'}
Flask郵件發(fā)送
from flask import Flask
from flask_mail import Mail, Message
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = 'ypcc624@163.com'
app.config['MAIL_PASSWORD'] = 'abcd1234'
mail = Mail(app)
@app.route('/send_mail/')
def send_mail():
message = Message('郵件轟炸機', sender=app.config["MAIL_USERNAME"], recipients=["779598160@qq.com"])
message.body = '成功啦跋理,開始轟炸啦'
send_email(message)
return '發(fā)送成功'
def send_email(msg):
mail.send(msg)
if __name__ == '__main__':
app.run()
參數以及說明
首先需要開啟客戶端授權碼择克,并設置授權碼。
安裝flask-mail
pip install flask-mail
設置的參數定義如下:
MAIL_SERVER: 電子郵件服務器的主機名或IP地址前普, 默認為localhost
MAIL_PORT: 電子郵件服務器的端口肚邢,默認為25
MAIL_USE_TLS: 啟用傳輸層安全協(xié)議,默認為False
MAIL_USE_SSL: 啟用安全套接層協(xié)議, 默認為False
MAIL_USERNAME: 郵件賬戶的用戶名
MAIL_PASSWORD:郵件賬戶的密碼骡湖,為在163中設置的授權碼