zoukankan      html  css  js  c++  java
  • 基于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:ProgramDataMySQLMySQL 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:ProgramDataAnaconda3envsflask-testlibsite-packagessqlalchemydialectsmysqlase.py", line 1996, in get_table_names
    
        self.identifier_preparer.quote_identifier(current_schema))
    
      File "D:ProgramDataAnaconda3envsflask-testlibsite-packagessqlalchemysqlcompiler.py", line 3067, in quote_identifier
    
        self._escape_identifier(value) + 
    
    File "D:ProgramDataAnaconda3envsflask-testlibsite-packagessqlalchemydialectsmysqlmysqlconnector.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'
    
     
    
    根据日志修改Anaconda3envsflask-testlibsite-packagessqlalchemysqlcompiler.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 Server 2008关闭internet explorer增强的安全配置
    【转载并整理】mysql分页方法
    Mysql:MyIsam和InnoDB的区别
    【转载】web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法
    【转载】java前后端 动静分离,JavaWeb项目为什么我们要放弃jsp?
    Redis命令汇总
    Redis介绍及安装
    【转载】Spring Cache介绍
    简单示例:Spring4 整合 单个Redis服务
    【转载整理】Hibernater的锁机制
  • 原文地址:https://www.cnblogs.com/applex007/p/10287355.html
Copyright © 2011-2022 走看看