「源碼分享」用flask創(chuàng)建一個完整的工程結構
Flask是一個使用 Python 編寫的輕量級 Web 應用框架。與django不同,django創(chuàng)建工程時,會直接構架好工程結構。?而flask工程幾乎是自己創(chuàng)建結構。在此介紹 PyCharm 下flask如何創(chuàng)建有一個完整的工程結構。
以用戶登錄模型為例,介紹流程:
注意:若在pycharm中運行的話。需要配置以下設置,此設置不會導入文件時因為識別不了而報錯:
文件→設置→項目:XX→Project Structure→選中文件夾→點擊上方的源碼(source)→點擊確定即可
1、導入相關模塊以及需要使用的模塊:
pip install flask pip install pymysql pip install flask_sqlalchemy pip install flask_migrate pip install flask_script flask_session(無需安裝) flask_blueprint(無需安裝)
模塊解釋:
<1> flask:安裝 flask 及其依賴
<2> flask_sqlalchemy,pymysql:用Flask對象初始化SQLAlchemy,可以在flask項目中使用MTV模
式進行各種對數(shù)據(jù)庫的操作
<3> flask_migrate,flask_script:用于數(shù)據(jù)庫的遷移操作,其中flask_script用來設置應用程序通過
指令操作;flask_migrate導入數(shù)據(jù)庫遷移類和數(shù)據(jù)庫遷移指令類
<4> flask_session:對flask里面配合redis對session進行操作,存儲或清除字段
<5> flask_blueprint:可以讓Flask對象注冊多個藍圖對象,相當于插入了blueprint的包裝器,能夠分
割功能模塊,能夠更清晰的進行業(yè)務開發(fā),而不是將所有的業(yè)務處理都寫在一個views里
2、創(chuàng)建工程項目文件夾,命名為flask
3、在flask文件夾下:(static,templates名稱不可自擬!)
① 創(chuàng)建功能模塊文件夾app1,并在app1下創(chuàng)建靜態(tài)文件“ 私有 ”文件夾static,以及創(chuàng)建前端頁面文
件夾tamplates
② 創(chuàng)建靜態(tài)文件“ 共享 ”文件夾static(若需要用到include語法,建議創(chuàng)建在該static下創(chuàng)建templates
文件夾,用來放置工程里面的共享網頁模塊)
4、創(chuàng)建工程目錄flask下創(chuàng)建app.py文件,配置如下:
#導入flask模塊 from flask import Flask # 創(chuàng)建Flask的實例app,并設置共享網頁文件夾templates的訪問位置 app = Flask(__name__,template_folder='static/templates') # 設置代碼發(fā)生改變時,自動啟動服務器 app.debug=True # 以下兩句先不寫,藍圖創(chuàng)建后執(zhí)行 # from app1.views import app1 # app.register_blueprint(app1, url_prefix='/app1')
5、進入mysql數(shù)據(jù)庫中,創(chuàng)建一個數(shù)據(jù)庫infor(create database infor; ?命名可自擬)
6、在flask文件夾下引入數(shù)據(jù)庫封裝文件db_operate.py,此文件在第Y17博客中有介紹以及源代碼。(除此之外,當然也可自己設置一個 setttings.py 文件,在其中配置連接數(shù)據(jù)庫,數(shù)據(jù)庫連接配置代碼如下,注意之后在需要運行數(shù)據(jù)庫的文件中導入該文件)
# 導入SQLAlchemy,可操作數(shù)據(jù)庫以及連接數(shù)據(jù)庫 from flask_sqlalchemy import SQLAlchemy # 導入app工程文件 from app import app # 連接數(shù)據(jù)庫(格式:'mysql+pymysql://用戶名:密碼@端口號/數(shù)據(jù)庫名') app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:ysh7776...@127.0.0.1/infor' # 數(shù)據(jù)庫連接(生成一個數(shù)據(jù)庫操作對象) db = SQLAlchemy(app)
7、在功能模塊文件夾下(app1),創(chuàng)建models.py,用來創(chuàng)建模型數(shù)據(jù)。 代碼如下:
# 導入db_operate文件中的db數(shù)據(jù)庫,DBO(封裝的數(shù)據(jù)庫操作函數(shù),覺得不需要也可不導DBO) from db_operate import db,DBO # 創(chuàng)建簡單的用戶賬號,密碼模型。(flask一對一,一對多,多對多關系的創(chuàng)建在第Y18博客中有介 紹) class User(db.Model,DBO): userid = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(77),nullable=False,unique=True) password = db.Column(db.String(77),nullable=False) # 表格更名 __tablename__ = 'user' # 初始化每個實例。(若在第6步導入DBO文件,可不用寫以下初始化語句,DBO類方法中已封 裝。) def __init__(self, username, password): self.username = username self.password = password
8、在flask文件下創(chuàng)建manage.py(命名不可自擬!),在其中配置數(shù)據(jù)庫的遷移操作。配置如下:
# 導入app工程 from app import app # 導入數(shù)據(jù)庫 from db_operate import db # 導入Manager用來設置應用程序可通過指令操作 from flask_script import Manager 導入數(shù)據(jù)庫遷移類和數(shù)據(jù)庫遷移指令類 from flask_migrate import Migrate,MigrateCommand # 構建指令,設置當前app受指令控制(即將指令綁定給指定app對象) manage = Manager(app) # 構建數(shù)據(jù)庫遷移操作,將數(shù)據(jù)庫遷移指令綁定給指定的app和數(shù)據(jù)庫 migrate = Migrate(app,db) # 添加數(shù)據(jù)庫遷移指令,該操作保證數(shù)據(jù)庫的遷移可以使用指令操作 manage.add_command('db',MigrateCommand) #以下為當指令操作runserver時,開啟服務。 if __name__ == '__main__': manage.run()
9、開始遷移數(shù)據(jù)庫,在Terminal中執(zhí)行以下三句指令:
注意: 執(zhí)行語句之前,一定要將models里面的模型,導入到app.py中。否則執(zhí)行第二句時就會報錯。
① python manage.py db init ?(只運行一次,為生成migrations文件夾,以便之后數(shù)據(jù)改變,版本
遷移)
② python manage.py db migrate ?(完成遷移)
③ python manage.py db upgrade ?(更新數(shù)據(jù)庫表格)
10、進入mysql數(shù)據(jù)庫中,通過 use infor; 和 show tables; 來查看是否遷移成功,若成功向里面插入1~2條數(shù)據(jù),用來測試,如下圖:
11、在app1/templates下,創(chuàng)建簡單前端網頁(login.html)。之后在app1下創(chuàng)建views.py,在其中創(chuàng)建藍圖,配置路由,并完成渲染頁面,實現(xiàn)各個功能的數(shù)據(jù)交互的操作。 代碼如下:
# 導入渲染模塊,藍圖模塊,數(shù)據(jù)傳輸模塊,路由分配模塊 from flask import render_template, Blueprint, request,url_for # 導入創(chuàng)建的模型,用來完成下面定義功能時對數(shù)據(jù)庫的操作 from .models import * # 導入json,來完成前后端的數(shù)據(jù)交互 import json # 創(chuàng)建藍圖。藍圖必須有前兩個參數(shù),為“藍圖名”,“當前運行文件名”。后兩個是設置藍圖文件夾 (藍圖文件夾即為app1文件夾)在訪問私有網頁文件夾templates的位置目錄,以及私有靜態(tài)文件的位 置目錄 app1 = Blueprint('app1', __name__, template_folder='templates',static_folder='static') # 定義函數(shù)渲染網頁 @app1.route('/login/',endpoint='login') def show_login(): return render_template( 'login.html', jquery=url_for('static', filename='js/jquery.min.js'), url_img = url_for('app1.static',filename='img/1.jpg',_external=True), url_login = url_for('app1.account_login', _external=True) ) @app1.route('/test/',endpoint='test') def show_test(): return render_template('test0.html') # 功能函數(shù) # 定義函數(shù)實現(xiàn)登錄功能 @app1.route('/account_login/',methods=['GET','POST']) def account_login(): if request.method == 'POST': username = request.values.get('username') password = request.values.get('password') res = User.query.filter(User.username == username).all() object = None for item in res: object=item if object is None: msg = {'code': 400, 'infor': '用戶名不存在,請注冊'} else: if object.password == password: msg = {'code': 200, 'infor': '登陸成功'} else: msg = {'code': 400, 'infor': '密碼錯誤,請重新輸入'} else: msg = {'code': 400, 'infor': '請求方式不正確'} return json.dumps(msg)
12、完成views.py中藍圖創(chuàng)建以及其他配置之后,到app.py中注冊藍圖。 代碼如下(接第4步中的代碼):
from flask import Flask app = Flask(__name__,template_folder='static/templates') app.debug=True # 導入app1/views.py中創(chuàng)建的藍圖 from app1.views import app1 # 注冊該藍圖 app.register_blueprint(app1, url_prefix='/app1')
13、此時到前端頁面,實現(xiàn)對應的登錄功能的交互。頁面效果可以自定,所以在此只給出交互的代碼:
// 第11步中已配置好的jquery文件位置,可直接用{{}}接收地址。 <script src="{{jquery}}"></script> <script type="text/javascript"> $('input[type=submit]').on('click',function (event) { event.preventDefault(); let paras = $('form').serialize(); $.ajax({ type:'post', url:'{{url_login}}', data:paras, success:function (res) { res = JSON.parse(res); alert(res.infor) } }) }) </script>
14、在Terminal中,進入工程目錄(flask)下,執(zhí)行 python mange.py runserver 啟動服務。在網頁中輸入 127.0.0.1/app1/login 即可顯示頁面。若想再創(chuàng)建其他功能模塊,在flask下創(chuàng)建app2文件夾(命名自擬),注冊藍圖。完操作和app1中的完全相同。
聲明:文章轉載于網絡,版權歸原作者所有!