1下載mysql-installer-community-5.7.24.0.msihtml
(https://dev.mysql.com/downloads/windows/installer/8.0.html, 選擇 Looking for previous GA versions?)python
2.安裝mysql
2.1選擇模塊ios
2.2安裝方式git
2.3設置密碼github
2.4查看環境變量redis
3. 配置數據庫sql
3.1 配置服務器編碼數據庫
在my.ini文件下修改(默認在C:\ProgramData\MySQL\MySQL Server 5.7,可經過查看服務啓動配置文件獲取):flask
[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模塊目錄),並編寫項目入口文件,將配置文件及其餘初始化文件按照應用應用實例文件夾分開放置