實驗原理:
1.什么是flask
Flask是一個使用Python編寫的輕量級Web應用框架,其WSGI工具采用Werkzeng,模板引擎使用Jinja2。Flask與 Django之間的區別就是Django將所有的拓展功能全部集中在了一起,因此其占據內存較多,而Flask作為一個輕量級的框架,通過拓展或者python的庫來增加功能,因此占據的內存小。需要什么,導入什么。
並且flask基於python語言,對有一定python基礎的開發者十分友好。
2.Flask基礎知識
a.Flask目錄結構:
對於一個項目,flask對於項目文件的命名具有一定的要求。
在工作目錄下一定要有兩個文件夾和一個文件,其中圖片,視頻,css代碼,js代碼,icon等靜態的資源放 在static文件夾下(名字一定不能弄錯),css代碼要新建一個css目錄並放在該目錄下,js代碼要新建一個js目錄並放在該目錄下。
之后,對於html文件,要放在templates文件夾下。最后,運行的.py文件默認命名為app.py以及wsgi.py。
總之如下:
b.Flask基礎用法:
首先,Flask在python中是作為類封裝好的,因此要先使用import來導入flask類,其次就是要實例化類,使用app = Flask(name)可以實例化一個flask類。之后,Flask開發的基本模式就是在程序中將一個視圖函數分配一個URL,當用戶訪問一個URL時,系統就會執行這個URL對應的視圖函數,然后將返回值渲染到瀏覽器上。
將視圖函數賦予url需要使用@route(“url”)裝飾器,url為要訪問的資源頁面,默認情況下在根目錄,也就是“/”,然后在這個裝飾器后定義視圖函數。
視圖函數的返回值,可以直接插入html代碼,也可以使用render_template()函數來指定html文件(該文件一定要放在templates文件夾下),也可以使用redirect函數將其重定向到另一個視圖函數對應的url。
c.如何在html中插入flask代碼,如何將flask中的數據傳入html中?
在html中,使用變量以及調用函數要使用{{變量名}}來指定flask代碼中的變量,Flask的python語句要使用{% %}來插入,如:
注意,if語句后面要有endif,for語句后面要有endfor。
如何傳輸數據:
可以使用render_template()函數,第一個參數為要渲染的html文件,后面的多個參數為 html中的變量名 = py中的變量名。
d.Flask中的數據庫flask_sqlalchemy
使用這個數據庫,首先需要指定db文件的工作目錄,
WIN = sys.platform.startswith('win')
if WIN:
prefix = 'sqlite:///'
else:
prefix = 'sqlite:////'
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'secret string')
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', prefix + os.path.join(app.root_path, 'data.db'))
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
這些配置的目的就是將db文件命名為data.db然后將db文件的生成以及工作目錄都指定到根目錄下。
由於數據庫在python中也是一個對象,因此也需要實例化,使用db = SQLAlchemy(app)實例化。
在flask_sqlalchemy中,一個表就是python中的一個類,因此,要定義表,就得定義一個類。
class books(db.Model):
id = db.Column(db.Integer, primary_key=True)
book_id = db.Column(db.Integer)
book_name = db.Column(db.String(100))
classification = db.Column(db.String(20))
然后使用db.create_all()方式來在db文件中創建一個這樣的表,然后實例化這個類,將這個類的對象作為一行添加到表中(db.session.add(Book)),然后再使用db.session.commit()提交更新,就可以完成一個數據的填入了,之后在使用類方法的query.all()就可以查詢出所有的信息了。
e.如何引用css文件:
html引用flask項目中的文件,只能使用url_for方法,並且由於這個是python函數,因此要用{{}}括起來,然后有兩個參數,第一個參數代表這個文件是靜態文件還是其他的文件,因此是”static”,第二個參數代表的是以一個參數為根目錄的css文件的路徑信息。代碼如下:
<link rel="stylesheet" href="{{ url_for('static',filename ='css/style.css') }}">
f.如何運行以及開發flask程序:
首先,如果不想讓環境之間相互影響,建議使用pipenv來管理包,首先使用pipenv install來安裝需要的包,如果沒有對應的配置文件,會生成兩個配置文件,Pipfile以及Pipfile.lock,以后使用pipenv install的時候,相關包的文件就會自動存儲在Pipfile和.lock當中,下次到新環境時使用pipenv install就可以自動下載。之后,使用pipenv shell來創建一個新的虛擬環境。然后使用flask run命令就可以跑起來了。
如果要進入開發者模式的話,可以手動建立一個.flaskenv文件,個app.py文件同目錄,然后寫上FLASK_ENV=development一句話就行了。
進入開發者模式后,每次修改完代碼只要將瀏覽器硬刷新后就可以實時顯示修改完的信息,不用重啟程序,並且錯誤之后會進入了Jinja2提供的debug頁面,里面詳細的說了錯誤的信息(有時)。
實驗內容:
本次實驗需要使用python讀取book.txt中的內容,將其使用某種數據結構化存儲,然后以表格的形式顯示在web的頁面上。
實驗步驟及具體實現:
1.讀取book.txt中的數據
定義一個函數read_file(),使用python中open方法打開文件,然后使用f.readlines將文件一行一行以列表的形式讀入,去除\n以及一些奇怪的字符后使用split獲得包含所有信息的二維數組。
代碼以及結果如下:
2.創建數據庫,將書籍信息存入到數據庫中。
首先是實例化數據庫,之后修改配置文件,這個之前在基本原理中已經講了,代碼如下:
創建一個書籍的表,該表一共有三個字段,分別為書籍序號,書籍名,書籍分類。
然后創建視圖函數,將讀到每一本圖書的信息作為參數將books類實例化,然后加入到表中。
3.編寫前端html,渲染html並且將書籍信息傳入到html中。
a)在視圖函數中調用查詢函數,將書籍信息從數據庫中查詢出來,然后使用render_template()函數渲染html並且將取得的books信息傳入html文件中:
b)前端建立一個表格,然后使用for循環不斷地添加表格的行
該代碼使用for循環不斷讀取books中的圖書信息,然后生成表格的一列。
p.s 當然,這其中使用了css文件調整了樣式,這里不細說了。
最后的實驗結果如下:
心得體會:
1.在創建數據庫的時候,要先調用create_all()才可以重新創建已經定義好的表類,不然的話db.session.submit()會報錯。
2.在html中使用for語句,可以快速的形成重復的代碼,使代碼更加簡潔,而且可以根據數據庫動態更新。
3.這次實驗可以說是簡單編寫了一下flask的前后端,前端簡單使用了html和css代碼,后端簡單使用了數據庫,並且實現了前后端的交互,還是很不錯的。