基於windows環境的Flask網站搭建(mysql + conda + redis)
1下載mysql-installer-community-5.7.24.0.msi
(https://dev.mysql.com/downloads/windows/installer/8.0.html, 選擇 Looking for previous GA versions?)
2.安裝
2.1選擇模塊
2.2安裝方式
2.3設置密碼
2.4查看環境變量
3. 配置數據庫
3.1 配置服務器編碼
在my.ini文件下修改(默認在C:\ProgramData\MySQL\MySQL Server 5.7,可通過查看服務啟動配置文件獲取):
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8 //註意這裏和client,mysql不一樣
註意: mysql到了5.5版本, [mysql] 項內可以寫default-character-set=utf8, 但是[mysqld] 項內不能再這麽寫了,而是必須寫:character-set-server=utf8
重啟服務net stop mysql57,net start mysql57
3.2 連接mysql
Cmd窗口輸入mysql -u root -p,輸入密碼
3.3 創建數據庫
create database mydatabase;
3.4 設置數據庫編碼方式
查看編碼, show variables like ‘%character%‘;
可以通過命令 set character_set_connection = utf8;逐項修改,Windows下關註 character_set_database character_set_server character_set_system 三項就可以了
4. Anaconda3 + python3.6 + mysql + flask-sqlalchemy + flask-migrate配置
4.1配置Anaconda
開始菜單中啟動Anaconda prompt
查看所有虛擬環境 conda info -e 或 conda env list 切換平臺 set CONDA_FORCE_32BIT=1 //切換到32位 set CONDA_FORCE_32BIT= // 切換到64位 創建新python環境 conda create -n env_name python=3.6 # 指定python為3.6,否則安裝最新版本 conda create -n env_name numpy matplotlib python=3.6 # 同時安裝必要的包 切換環境 conda activate env_name conda deactivate env_name 移除環境 conda remove -n env_name --all 查看環境安裝的包 conda list conda list -n env_name 當前中環境安裝包 conda install python3.6
4.2在conda虛擬環境下通過pip安裝 flask、mysql-connector-python、flask-sqlalchemy
4.3 按照flask、flask-sqlalchemy、flask-migrate 編寫代碼,並在flask配置項中配置數據庫:
SQLALCHEMY_DATABASE_URI = ‘mysql+mysqlconnector://uname:password@localhost:3306/mydatabase?charset=utf8;use_unicode=False‘ 其中,use_unicode用於解決讀取二進制數據時報錯:UnicodeDecodeError:‘utf-8‘ codec can‘t decode byte 0xb0 in position 0
4.4關於使用flask-migrate初始化、遷徙、更新數據庫
python manager db init 創建初始化腳本 python manager db migrate 創建遷徙版本(版本數據表alembic_version ) python manager db upgrade生成對應版本數據庫 備註:初次按順序執行如上三條指令時,效果同初始化數據庫; 後續遷徙數據庫時,依次執行後兩條指令,遷徙成功後數據庫數據會保留;
經測試,在python3.6環境下執行第二步時會出錯: File "D:\ProgramData\Anaconda3\envs\flask-test\lib\site-packages\sqlalchemy\dialects\mysql\base.py", line 1996, in get_table_names self.identifier_preparer.quote_identifier(current_schema)) File "D:\ProgramData\Anaconda3\envs\flask-test\lib\site-packages\sqlalchemy\sql\compiler.py", line 3067, in quote_identifier self._escape_identifier(value) + File "D:\ProgramData\Anaconda3\envs\flask-test\lib\site-packages\sqlalchemy\dialects\mysql\mysqlconnector.py", line 97, in _escape_identifier value = value.replace(self.escape_quote, self.escape_to_quote) TypeError: <flask_script.commands.Command object at 0x0000011690B8D4E0>: a bytes-like object is required, not ‘str‘ 根據日誌修改Anaconda3\envs\flask-test\lib\site-packages\sqlalchemy\sql\compiler.py 的3067行,增加如下代碼: if not isinstance(value, str): value = str(value, ‘utf-8‘) 在flask數據庫配置為sqlite情況下,測試遷徙成功: app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘sqlite:///app.db‘ 在flask數據庫配置為mysql情況下,首次執行初始化數據庫時可以成功,但在Model文件變動後遷徙數據庫時出現 Table ‘***‘ already exists錯誤
使用flask-migrate一是出現python3.X下代碼兼容問題,二是無法在mysal下成功完成數據庫遷徙,故綜上放棄flask-migrate的配置與使用,
同時需要修改使用flask-sqlalchemy原生的數據庫創建方式,在app初始化代碼後面增加:db.create_all()
5. 配置redis及flask-session
默認flask采用secret cookies方式進行session存儲的,這種存儲方式將需要的信息傳輸到瀏覽器端後存儲在加密後cookies信息中,經測試這種方式存在瀏覽器兼容性,在手機端(ios)UC瀏覽器中,當flask服務端調用session.clear()清除session信息時(例如像主動退出登錄這樣的場景時),瀏覽器端並未成功清除掉登錄信息,從而導致無法退出登錄,必須清空瀏覽器緩存
故采用redis作為session存儲方式,同時redis也可配置作為flask緩存,在python代碼中直接調用
redis是一個開源的、使用C語言編寫的、支持網絡交互的、可基於內存也可持久化的Key-Value數據庫
5.1下載並安裝配置redis
Windows系統下載微軟客制版本https://github.com/MicrosoftArchive/redis
Linux系統下載官網版本 https://redis.io/download
Linux下需要先編譯再安裝,ubuntu下也可使用$sudo apt-get install redis-server進行安裝,安裝完成的redis包含兩個模塊redis-server 和 redis-cli, 其中redis-cli是命令行客戶端
在安裝目錄找到conf文件(windows下有兩個,根據需求選擇),修改或添加如下內容:
requirepass mypassword 為redis # 設置密碼 port 8880 #修改端口號
Windows下安裝為系統服務:
redis-server --service-install redis.windows.conf //安裝服務
redis-server --service-start //啟動服務
redis-server --service-stop //停止服務
redis-server --service-uninstall //卸載服務
Linux下安裝和配置為自啟服務參考:
https://www.cnblogs.com/skyessay/p/6433349.html
https://www.jb51.net/article/101508.htm
服務啟動後可以使用redis-cli測試:
連接redis redis-cli.exe -h 127.0.0.1 -p 8880 密碼認證 auth ‘mypassword‘ 切換數據庫(redis有16個[0-15]數據庫,默認連接使用的是0) select 1 查看當前所有索引 127.0.0.1:8880> keys * 字符串存取 set myKey abc get myKey 哈希值存取 hmset myhash field1 "Hello" field2 "World" hget myhash field1 列表集合存取 lpush mylist element1 lpush mylist element2 Lrange mylist 0 10 set集合值存取 sadd myset member1 sadd myset member2 Smembers key zset有序集合(zadd myzset score member,score為序號) zadd myzset 0 member1 zadd myzset 0 member2 Zrangebyscore myzset 0 10
其他操作見https://www.runoob.com/redis/redis-tutorial.html
5.2安裝redis,flask-session模塊:
pip install redis
pip install flask-session
在flask配置項中配置flask的session type為redis
SESSION_TYPE = ‘redis‘ # session類型為redis SESSION_PERMANENT = True # 會話持久化 PERMANENT_SESSION_LIFETIME = 60 * 30 # 持久化時間設為30分鐘 SESSION_USE_SIGNER = True # 是否對發送到瀏覽器上session的cookie值進行加密 SESSION_KEY_PREFIX = ‘session:‘ # 保存到session中的值的前綴 SESSION_REDIS = redis.Redis(host=‘localhost‘, port=8880, password=‘mypassword‘, db=1) # 用於連接redis的配置
6. 打包項目並移植到新環境
使用wheel對flask項目進行打包移植,打包移植分為2種方式,
一種是打包成為模塊並安裝到新環境,
另外一種則是僅配置當前環境依賴文件,將源碼移植到新環境後按照配置一鍵部署新環境
6.1首先需要在項目根目錄配置setup.py和 MANIFEST.in文件,並確保項目已安裝wheel模塊,具體可參考flask及pypa官方文檔
https://dormousehole.readthedocs.io/en/latest/tutorial/install.html
https://packaging.python.org/tutorials/packaging-projects/
#[setup.py]
from setuptools import find_packages, setup
setup(
name=‘myproject‘,
version=‘1.0.0‘,
author="myname",
description="myproject‘package",
packages=find_packages(),
include_package_data=True,
zip_safe=False,
install_requires=[
‘flask‘,
‘flask-sqlalchemy‘,
‘flask-session‘,
‘mysql-connector-python‘,
‘redis‘
],
classifiers=[
"Programming Language :: Python :: 3",
]
[manifest.in]
graft instance
graft myproject/instance
graft myproject/resources/font
graft myproject/static
graft myproject/templates
include start.py
global-exclude *.pyc
# 備註:graft指定拷貝的無依賴靜態文件目錄, include指定非模塊py文件,global-exclude 指定忽略所有pyc(python可執行)文件
在當前python環境中執行python3 setup.py sdist bdist_wheel,會在dist目錄生成tar.gz源碼和whl模塊兩個文件
6.2源碼移植
將tar.gz源碼解壓到新目錄,在新python虛擬環境中定位到當前目錄並執行pip install -e . ,pip會在當前文件夾中尋找 setup.py 並安裝所需依賴(此時源碼在當前路徑也會被pip識別為一個模塊)
6.2模塊移植
模塊移植是指在新python虛擬環境中定位到前面生成的whl文件並執行pip install ***.whl 進行安裝pip會將模塊安裝到site-packages目錄下,就像安裝其他模塊那樣
註意:模塊安裝本身不存在什麽問題,但是模塊打包並不會將flask項目根目錄的入口文件包含進去(模塊僅會打包指定模塊目錄下的文件,如前文的myproject目錄),故將flask項目作為模塊安裝後,在新環境下需要重新編寫入口文件並啟動app對象,同時要保證配置文件能夠被正確識別到,當flask項目模塊中設置instance_relative_config=True時,其讀取配置文件的路徑為:
envs\\mytest-flask\\var\\myproject-instance\\config.py
Flask的默認讀取配置文件的路徑在當前代碼目錄,如果在初始化時設置了instance_relative_config=True,則讀取的配置文件路徑在根目錄下instance文件夾:
在配置文件中的關聯路徑的行為可以在 “關聯到應用的根路徑”(缺省的)和 “關聯到實例文件夾”之間變換, 具體通過應用構建函數中的 instance_relative_config 來實現:
app = Flask(__name__, instance_relative_config=True)
如果使用虛擬python環境,建議采用源碼移植部署方式,或者在flask項目打包前將instance_relative_config配置為False,同時在將配置文件及其它初始化文件放置應用模塊根目錄下
如果使用系統python環境,可使用模塊移植部署方式(此時flask項目將會作為模塊安裝到系統python模塊目錄),並編寫項目入口文件,將配置文件及其他初始化文件按照應用應用實例文件夾分開放置
基於windows環境的Flask網站搭建(mysql + conda + redis)