組織一個(gè) Flask 項(xiàng)目通常需要遵循一定的結(jié)構(gòu),以便代碼清晰、可維護(hù)。下面是一個(gè)典型的 Flask 項(xiàng)目結(jié)構(gòu):
my_flask_app/
│
├── app/
│ ├── __init__.py
│ ├── models.py
│ ├── views.py
│ ├── forms.py
│ ├── templates/
│ │ ├── base.html
│ │ ├── index.html
│ └── static/
│ ├── css/
│ ├── js/
│ └── images/
│
├── migrations/
│
├── tests/
│ ├── __init__.py
│ ├── test_app.py
│
├── venv/
│
├── config.py
│
├── manage.py
│
├── requirements.txt
│
└── README.md
目錄和文件說明
app/
__init__.py
: 初始化 Flask 應(yīng)用,注冊藍(lán)圖和擴(kuò)展。models.py
: 數(shù)據(jù)庫模型定義。views.py
: 視圖函數(shù),處理路由和請求。forms.py
: 表單定義(如果使用 Flask-WTF)。templates/
: HTML 模板文件。static/
: 靜態(tài)文件(CSS、JavaScript、圖像等)。
migrations/
- 數(shù)據(jù)庫遷移文件夾,用于存儲(chǔ) Alembic 生成的遷移腳本。
tests/
venv/
config.py
- 配置文件,存儲(chǔ)應(yīng)用配置變量。
manage.py
- 管理腳本,用于啟動(dòng)應(yīng)用和其他管理任務(wù)。
requirements.txt
README.md
- 項(xiàng)目說明文件,提供項(xiàng)目的基本信息和使用說明。
安裝:
? ? ? ? pip install Flask-WTF
一. 在 forms.py中?
# forms.pyfrom flask_wtf.file import (FileRequired, # 文件驗(yàn)證MultipleFileField, # 多文件字段FileAllowed, FileField, FileSize, # 文件字段 文件驗(yàn)證FileStorage
)
from wtforms.fields import simple # 導(dǎo)入字段
from wtforms import validators # 導(dǎo)入驗(yàn)證器
from wtforms import widgets # 導(dǎo)入組件
from wtforms.form import Form
from flask_wtf.form import FlaskForm, Form # 導(dǎo)入form""" 驗(yàn)證碼 """
from flask_wtf import Form, RecaptchaField""" URL """
from wtforms.fields import URLField
from wtforms.validators import url""" 文件 """
from flask_wtf import file # 文件
from flask_wtf import recaptcha # 驗(yàn)證碼
from flask_wtf.file import (FileRequired, # 文件字段MultipleFileField # 多文件字段)class LoginForm(FlaskForm):username = simple.StringField("用戶名", validators=[validators.Length(min=4, max=6, message="長度只能是4~6位"),validators.DataRequired(),validators.Regexp(r'\d+', message="只能是數(shù)字")],widget=widgets.TextInput())password = simple.PasswordField("密碼", validators=[validators.Length(min=6, message="長度不能少于6位"),validators.DataRequired()],widget=widgets.PasswordInput())confirm = simple.PasswordField('確認(rèn)密碼', validators=[validators.Length(min=6, message="長度不能少于6位"),validators.DataRequired(),validators.EqualTo("password",message="密碼不一致")],widget=widgets.PasswordInput())submit = simple.SubmitField("登錄")class UserForm(FlaskForm, Form):username = simple.StringField('用戶名',[validators.Length(min=4, max=25, message="長度最小不能少于4最大不能大于25"),validators.DataRequired(message="不能為空"),validators.Regexp(r'[A-Za-z0-9_\-\u4e00-\u9fa5]+')], widget=widgets.TextInput(),render_kw={"class": "username"})email = simple.StringField('郵箱', [validators.Length(min=6, max=35)], widget=widgets.EmailInput())password = simple.PasswordField('密碼', [validators.Length(min=6, message="長度不能少于6位"),validators.DataRequired(message="不可為空"), ],widget=widgets.PasswordInput())confirm = simple.PasswordField('確認(rèn)密碼', [validators.Length(min=6, message="長度不能少于6位"),validators.DataRequired(message="不可為空"),validators.EqualTo('password', message='密碼不一致')],widget=widgets.PasswordInput())accept_tos = simple.BooleanField('接受協(xié)議', [validators.DataRequired()], widget=widgets.CheckboxInput())submit = simple.SubmitField("登錄", widget=widgets.SubmitInput())class UploadForm(FlaskForm):file = simple.FileField("文件", validators=[file.FileRequired(), file.FileAllowed("jpg, png, gif",message="只允許上傳jpg, png, gif的圖片格式")])multiple = simple.MultipleFileField("多文件")submit = simple.SubmitField("提交")class LinkForm(Form):url = URLField(validators=[url()])class SignupForm(Form):username = simple.StringField('Username')recaptcha = RecaptchaField()
1.??導(dǎo)包

2. 登錄 form?

3.??字段驗(yàn)證

4. 用戶form
5. 文件form

6.? URL form
?7. 驗(yàn)證碼form
#? 待完成
二. 后端部分
# 導(dǎo)入 form# 路由 渲染到前端
三. 前端部分
<!-- 遍歷form -->