基于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)的更多相关文章
- 基于windows环境VsCode的ESP32开发环境搭建
1. 基于windows环境VsCode的ESP32开发环境搭建,网上有各类教程,但是我实测却不行. 例如我在vscode内安装的乐鑫插件,扩展配置项是下图这样: 而百度的各类博文却都是这样: 经过网 ...
- 基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案
基于Windows环境下cmd/编译器无法输入中文,显示中文乱码解决方案 两个月前做C++课设的时候,电脑编译器编译结果出现了中文乱码,寻求了百度和大神们,都没有解决这个问题,百度上一堆解释是对编译器 ...
- 【Kafka】基于Windows环境的Kafka有关环境(scala+zookeeper+kafka+可视化工具)搭建、以及使用.NET环境开发的案例代码与演示
前言:基于Windows系统下的Kafka环境搭建:以及使用.NET 6环境进行开发简单的生产者与消费者的演示. 一.环境部署 Kafka是使用Java语言和Scala语言开发的,所以需要有对应的Ja ...
- Windows环境下flask+Apache+mod_wsgi部署及爬坑
文章目录 安装python Windows 环境使用virtualenv和virtualenvwrapper 安装mod_wsgi 安装nginx 安装Apache 遇到的坑 安装Apache遇到的坑 ...
- Windows环境下 PyQt5 如何安装MySql驱动 (PyQt5连接MYSQL时显示Driver not loaded解决方案)
参考文章: https://blog.csdn.net/qq_38198744/article/details/80261695 前文说过如何在Ubuntu环境下 为PyQt5 安装MySql驱动, ...
- Windows环境下使用Nginx搭建负载均衡
前言 最近没有什么事情,喜欢总结并学习东西!前几天写来一个Session共享,那么我们为什么需要Session共享?因为我们的应用程序分布在多个服务器上,为了合理分配用户的请求,就需要用到负载均衡技术 ...
- windows环境下apache-apollo服务器搭建及发布订阅测试
查证了一些资料之后,发现 apache-apollo服务器使用的人还是挺多的,资料也比较齐全,所以直接选择 apache-apollo了,具体性能如何,先用起来再说吧: 1.下载 apache-apo ...
- windows 环境下Maven私服搭建
使用Nexus.3.11在Windows环境上搭建1.下载nexus.3.11.zip包https://www.sonatype.com/download-oss-sonatype 下载下来之后,进行 ...
- windows环境下利用Gitblit搭建Git服务器并实现自动部署Web站点目录
Git服务搭建多见于linux环境,但windows主机也不少,目前网上文章诸多不全,且以讹传讹,不甚清楚.下面介绍windows环境下的自动部署和发布. 所需环境及资源:Java环境.Gitblit ...
随机推荐
- 《k8s-1.13版本源码分析》-调度预选
本文大纲 预选流程 predicate的并发 一个node的predicate predicates的顺序 单个predicate执行过程 具体的predicate函数 本系列文章已经开源到githu ...
- vtigercrm特色功能介绍
1.邮件跟踪 市场营销活动中,我们给客户发出了大量的电子邮件,这些邮件被客户阅读的情况你了解吗?vtiger CRM中独特的邮件跟踪功能,可以让你了解到邮件是否被客户浏览.浏览的次数和时间.通过客户的 ...
- [ArcGIS API for JavaScript 4.8] Sample Code-Get Started-layers简介
[官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-layers/index.html] 一.Intro t ...
- Android8.0通知
android里面经常会使用Notification来显示通知的消息,一般使用NotificationManager来创建通知消息 NotificationManager manger = (Noti ...
- 使用 Vue 开发 scrollbar 滚动条组件
Vue 应该说是很火的一款前端库了,和 React 一样的高热度,今天就来用它写一个轻量的滚动条组件: 知识储备:要开发滚动条组件,需要知道知识点是如何计算滚动条的大小和位置,还有一个问题是如何监听容 ...
- ubuntu-18.04 设置开机启动脚本-亲测有效
ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.local重新发挥作用. 2.将下列内容复制进rc-local.servi ...
- kubernetes 存储卷
kubernetes 存储卷 数据卷用于实现容器持久化数据,Kubernetes对于数据卷重新定义,提供了丰富强大的功能.在Kubernetes系统中,当Pod重建的时候,数据卷会丢失,Kube ...
- Elasticsearch Java高级客户端
1. 概述 Java REST Client 有两种风格: Java Low Level REST Client :用于Elasticsearch的官方低级客户端.它允许通过http与Elastic ...
- 教你编写百度搜索广告过滤的chrome插件
1 前言 目前百度搜索列表首页里,广告5条正常内容是10条,而且广告都是前1到5条的位置,与正常内容的显示样式无异.对于我们这样有能力的开发者,其实可以简单的实现一个chrome插件,在百度搜索页面里 ...
- 并发系列(2)之 ThreadLocal 详解
本文将主要结合源码讲述 ThreadLocal 的使用场景和内部结构,以及 ThreadLocalMap 的内部结构:另外在阅读文本之前只好先了解一下引用和 HashMap 的相关知识,可以参考 Re ...