基於windows環境的Flask網站搭建(mysql + conda + redis)

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模塊目錄),並編寫項目入口文件,將配置文件及其餘初始化文件按照應用應用實例文件夾分開放置

相關文章
相關標籤/搜索