以此結構爲例,這個小項目是《Flask Web開發:基於python的web應用開發實戰》第一部分結束後的代碼框架html
第一層python
有app、tests、migrations三個文件夾和config.py、manage.py兩個py文件以及data-dev.sqlite、data-tests.sqlite兩個sqlite數據庫web
app文件夾下主要寫flask程序;
migrations 文件夾包含數據庫遷移腳本;
tests文件夾下編寫單元測試;sql
config.py用來存儲配置shell
manage.py 用於啓動程序以及其餘的程序任務數據庫
data-dev.sqlite是程序運行時所用的數據庫flask
data-tests.sqlite是單元測試所使用的數據庫bootstrap
app層session
下面有main、static、templates三個文件夾以及__init__.py、email.py、models.py三個py文件app
main文件夾用來保存藍本,此文件夾下__inir__.py文件裏面建立藍本,( 藍本和程序相似,也能夠定義路由。不一樣的是,在藍本中定義的路由處於休眠狀態,直到藍本註冊到程序上後,路由才真正成爲程序的一部分。)main文件夾下views.py用來保存程序的路由,errors.py用來處理錯誤,forms.py是存放表單定義
static存放靜態文件
templates用來存放響應的html文件,mail子文件裏面的用來保存發送郵件所需的.html和.txt文件
__inir__.py文件裏面包含create_app()函數,已經app的各類初始化
email.py包含send_email()發送文件函數(異步)
models.py包含User和Role兩個表定義
tests層
test_basics.py用來編寫單元測試
應該還有一個venv文件夾用來包含虛擬環境和一個requirements.txt 文件,此文件列出了全部依賴包,便於在其餘電腦中從新生成相同的虛擬環境
我的需掌握
config.py中含有一個基類Config定義,三個繼承類定義DevlopmentConfig、TestingConfig、ProductionConfig和一個元組config
manage.py中含有app 建立,manage、migrate初始化,以及make_shell_context()函數在命令行獲取上下文,避免頻繁導入還有test()函數,用來測試。
app下__init__.py文件含有create_app()函數,部分代碼有
bootstrap = Bootstrap() mail = Mail() moment = Moment() db = SQLAlchemy() def create_app(config_name): #建立app app = Flask(__name__) app.config.from_object(config[config_name]) #將配置類中的配置導入程序 config[config_name].init_app(app) bootstrap.init_app(app) mail.init_app(app) moment.init_app(app) db.init_app(app) from .main import main as main_blueprint #導入藍本main app.register_blueprint(main_blueprint) #在主程序中註冊藍本 return app
app.config.from_object(config[config_name]) 將配置類中的配置導入程序!!
在email中利用有這樣一行代碼
app = current_app._get_current_object()
current_app程序上下文!!!,理解有些模糊
在app/main/views下有一段代碼比較重要
@main.route('/',methods = ['POST','GET']) #請求方式無論是post仍是get都執行這個視圖函數 def index(): form = NameForm() #表單實例 if form.validate_on_submit(): #提交按鈕是否成功點擊 # 從數據庫中查找和表單數據同樣的數據,若是有,取第一個數據 user = User.query.filter_by(username = form.name.data).first() if user is None: #若是數據庫中沒有對應的數據 user = User(username = form.name.data) #在數據庫中對應的表中建立數據 db.session.add(user) #加入到用戶會話,以便數據庫進行提交 session['known'] = False #這是一個新用戶 if current_app.config['FLASKY_ADMIN']: #若是收件人已經定義,則調用發送郵件函數 send_email(current_app.config['FLASKY_ADMIN'],'New User','mail/new_user',user = user) flash('The mail has been sent out') else: session['known'] = True #這是一個老用戶 session['name'] = form.name.data #從表單獲取數據 return redirect(url_for('.index')) return render_template('index.html',current_time = datetime.utcnow(), form = form,name=session.get('name'),known
以上全是我的理解,初次接觸,學藝不精
2016-08-29