1. 程式人生 > >基於windows環境的Flask網站搭建(mysql + conda + redis)

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

而是 password 保留 test current tools mysql 創建方式 32bit

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)