0%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Flask-sqlacodegen
ORM操作有两种方式。



1.模型迁移到数据库中生成表,codefirst:使用flask-migrate:

需要flask-script:

from flask_script import Manager
from flask_migrate import Migrate ,MigrateCommand
from flask import Flask

app = Flask(__name__)
manager = Manager(app) # 注册App到脚本
Migrate(app,db) # 注册App和ORM对象
manager.add_command('db',MigrateCommand) # db为命令 即执行python manager.py db 命令

python setup.py db init:初始化

python setup.py db migrate:生成迁移脚本

python setup.py db upgrade:映射到数据库




2.已经建好数据库==>模型:使用flask-sqlacodegen:

安装:pip install flask-sqlacodegen

使用window环境下:

# 整体映射database数据库并写入model.py文件
flask-sqlacodegen \
mysql://username:password@127.0.0.1/database \
--outfile 'model.py' \
--flask

# 映射table数据表并写入table.py文件
flask-sqlacodegen \
mysql://username:password@127.0.0.1/database \
--table table \
--outfile 'model.py' \
--flask
flask-sqlacodegen mysql://root:@127.0.0.1/db_name --outfile "models/model.py" --flask

flask-sqlacodegen 'mysql://root:root@127.0.0.1/swzl' --table table  --outfile "app/models/user_model.py"  --flask

flask-sqlacodegen mysql://root:root@127.0.0.1/swzl --outfile all.py
flask-sqlacodegen mysql://root:root@127.0.0.1/swzl --tables t_user --outfile User.py


flask-sqlacodegen 'mysql://root:root@127.0.0.1/swzl' --tables t_user  --outfile "app/models/user_model.py"  --flask


flask-sqlacodegen mysql://root:@127.0.0.1/db_name --tables user --outfile "models/user.py" --flask

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
'DEBUG': False,  # 是否开启Debug模式
  'TESTING': False, # 是否开启测试模式
  'SECRET_KEY': None # 在启用Flask内置Session的时候/开启flash,一定要有它
  'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天
  'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字

  'PROPAGATE_EXCEPTIONS': None, # 异常传播(是否在控制台打印LOG) 当Debug或者testing开启后,自动为True
  'PRESERVE_CONTEXT_ON_EXCEPTION': None, # 一两句话说不清楚,一般不用它
  'SECRET_KEY': None, # 之前遇到过,在启用Session的时候,一定要有它
  'PERMANENT_SESSION_LIFETIME': 31, # days , Session的生命周期(天)默认31天
  'USE_X_SENDFILE': False, # 是否弃用 x_sendfile
  'LOGGER_NAME': None, # 日志记录器的名称
  'LOGGER_HANDLER_POLICY': 'always',
  'SERVER_NAME': None, # 服务访问域名
  'APPLICATION_ROOT': None, # 项目的完整路径
  'SESSION_COOKIE_NAME': 'session', # 在cookies中存放session加密字符串的名字
  'SESSION_COOKIE_DOMAIN': None, # 在哪个域名下会产生session记录在cookies中
  'SESSION_COOKIE_PATH': None, # cookies的路径
  'SESSION_COOKIE_HTTPONLY': True, # 控制 cookie 是否应被设置 httponly 的标志,
  'SESSION_COOKIE_SECURE': False, # 控制 cookie 是否应被设置安全标志
  'SESSION_REFRESH_EACH_REQUEST': True, # 这个标志控制永久会话如何刷新
  'MAX_CONTENT_LENGTH': None, # 如果设置为字节数, Flask 会拒绝内容长度大于此值的请求进入,并返回一个 413 状态码
  'SEND_FILE_MAX_AGE_DEFAULT': 12, # hours 默认缓存控制的最大期限
  'TRAP_BAD_REQUEST_ERRORS': False,
  # 如果这个值被设置为 True ,Flask不会执行 HTTP 异常的错误处理,而是像对待其它异常一样,
  # 通过异常栈让它冒泡地抛出。这对于需要找出 HTTP 异常源头的可怕调试情形是有用的。
  'TRAP_HTTP_EXCEPTIONS': False,
  # Werkzeug 处理请求中的特定数据的内部数据结构会抛出同样也是“错误的请求”异常的特殊的 key errors 。
  # 同样地,为了保持一致,许多操作可以显式地抛出 BadRequest 异常。
  # 因为在调试中,你希望准确地找出异常的原因,这个设置用于在这些情形下调试。
  'EXPLAIN_TEMPLATE_LOADING': False, # 如果这个值被设置为True,你只会得到常规的回溯。
  'PREFERRED_URL_SCHEME': 'http', # 生成URL的时候如果没有可用的 URL 模式话将使用这个值
  'JSON_AS_ASCII': True,
  # 默认情况下 Flask 使用 ascii 编码来序列化对象。如果这个值被设置为 False ,
  # Flask不会将其编码为 ASCII,并且按原样输出,返回它的 unicode 字符串。
  # 比如 jsonfiy 会自动地采用 utf-8 来编码它然后才进行传输。
  'JSON_SORT_KEYS': True,
  # 默认情况下 Flask 按照 JSON 对象的键的顺序来序来序列化它。
  # 这样做是为了确保键的顺序不会受到字典的哈希种子的影响,从而返回的值每次都是一致的,不会造成无用的额外 HTTP 缓存。
  # 你可以通过修改这个配置的值来覆盖默认的操作。但这是不被推荐的做法因为这个默认的行为可能会给你在性能的代价上带来改善。
  'JSONIFY_PRETTYPRINT_REGULAR': True,
  'JSONIFY_MIMETYPE': 'application/json',
  'TEMPLATES_AUTO_RELOAD': None,

其实本质都是python-dotenv加载环境变量出现的问题。

坑一:python-dotenv加载的Value都是字符串类型

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Flask-SQLalchemy:操作数据库;
Flask-script:插入脚本;
Flask-migrate:管理迁移数据库;
Flask-Session:Session存储方式指定;
Flask-WTF:表单;
Flask-Mail:邮件;
Flask-Bable:提供国际化和本地化支持,翻译;
Flask-Login:认证用户状态;
Flask-OpenID:认证;
Flask-RESTful:开发REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和时间;
Flask-Admin:简单而可扩展的管理接口的框架
扩展列表:http://flask.pocoo.org/extensions/

一:前言

介绍一个包管理神器-pipenv,这个工具可以让我们在写代码、创建Python运行环境、package依赖关系以及项目合作的时候更有效率。

阅读全文 »

以下内容摘自

Flask Web开发:
基于Python的Web应用开发实战

7.1 项目结构

Flask 程序的基本结构如示例 7-1 所示。
示例 7-1 多文件 Flask 程序的基本结构
|-flasky
|-app/
|-templates/
|-static/
|-main/
|-init.py
|-errors.py
|-forms.py
|-views.py
|-init.py
|-email.py
|-models.py
|-migrations/
|-tests/
|-init.py
|-test*.py
|-venv/
|-requirements.txt
|-config.py
|-manage.py
这种结构有 4 个顶级文件夹:
Flask 程序一般都保存在名为 app 的包中; •
和之前一样,migrations 文件夹包含数据库迁移脚本; •
单元测试编写在 tests 包中; •
和之前一样,venv 文件夹包含 Python 虚拟环境。 •
同时还创建了一些新文件:
requirements.txt 列出了所有依赖包,便于在其他电脑中重新生成相同的虚拟环境; •
config.py 存储配置; •
manage.py 用于启动程序以及其他的程序任务。 •
为了帮助你完全理解这个结构,下面几节讲解把 hello.py 程序转换成这种结构的过程。

阅读全文 »

微信服务器认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@app.route('/wx_flask',methods=['GET','POST'])
def wechat():
# 第一次接入服务器的验证
if request.method == 'GET':
#这里改写你在微信公众平台里输入的token
token = 'ctgu'
#获取输入参数
data = request.args
signature = data.get('signature','')
timestamp = data.get('timestamp','')
nonce = data.get('nonce','')
echostr = data.get('echostr','')
#字典排序
list = [token, timestamp, nonce]
list.sort()

s = list[0] + list[1] + list[2]
#sha1加密算法
hascode = hashlib.sha1(s.encode('utf-8')).hexdigest()
#如果是来自微信的请求,则回复echostr
if hascode == signature:
return echostr
else:
return "非微信官方请求"
#回复用户消息
elif request.method == "POST":
# 表示微信服务器转发消息过来
xml_str = request.data
if not xml_str:
return "不支持此此类型消息处理!"
# 对xml字符串进行解析
xml_dict = xmltodict.parse(xml_str)
xml_dict = xml_dict.get("xml")
return resp_by_msg_type(xml_dict)
阅读全文 »

PyPI(https://pypi.org )是一个Python包的在线仓库,截至2018年5月,
共有13万多个包存储在这里。后面我们会学习如何编写自己的Flask扩展,并把它
上传到PyPI上。到时你就可以使用上面这条命令安装自己编写的包。
现在使用pip安装Pipenv:
$ pip install pipenv
在Linux或macOS系统中使用sudo以全局安装:
$ sudo pip install pipenv
附注
如果你不想全局安装,可以添加–user选项执行用户安装(即pip install–
user pipenv),并手动将用户基础二进制目录添加到PATH环境变量中,具体可参
https://docs.pipenv.org/install/#installing-pipenv
提示
PyPI中的包名称不区分大小写。出于方便的考虑,后面的安装命令都将使用小
写名称。
可以使用下面的命令检查Pipenv是否已经安装:
$ pipenv --version
pipenv, version 11.10.4
2.创建虚拟环境
在Python中,虚拟环境(virtual enviroment)就是隔离的Python解释器环
境。通过创建虚拟环境,你可以拥有一个独立的Python解释器环境。这样做的好处
是可以为每一个项目创建独立的Python解释器环境,因为不同的项目常常会依赖不
同版本的库或Python版本。使用虚拟环境可以保持全局Python解释器环境的干净,
避免包和版本的混乱,并且可以方便地区分和记录每个项目的依赖,以便在新环境
下复现依赖环境。
虚拟环境通常使用Virtualenv来创建,但是为了更方便地管理虚拟环境和依赖
包,我们将会使用集成了Virtualenv的Pipenv。首先确保我们当前工作目录在示例
程序项目的根目录,即helloflask文件夹中,然后使用pipenv install命令为当
前的项目创建虚拟环境:
$ pipenv install
Creating a virtualenv for this project…
...
Virtualenv location: /path/to/virtualenv/helloflask-5Pa0ZfZw
...
这会为当前项目创建一个文件夹,其中包含隔离的Python解释器环境,并且安
装pip、wheel、setuptools等基本的包。因为示例程序仓库里包含Pipfile文件,
所以这个文件中列出的依赖包也会一并被安装,下面会具体介绍。
附注
默认情况下,Pipenv会统一管理所有虚拟环境。在Windows系统中,虚拟环境
文件夹会在C:\Users\Administrator.virtualenvs\目录下创建,而Linux或
macOS会在~/.local/share/virtualenvs/目录下创建。如果你想在项目目录内创
建虚拟环境文件夹,可以设置环境变量PIPENV_VENV_IN_PROJECT,这时名
为.venv的虚拟环境文件夹将在项目根目录被创建。
虚拟环境文件夹的目录名称的形式为“当前项目目录名+一串随机字符”,比如
helloflask-5Pa0ZfZw。
提示
你可以通过–three和–two选项来声明虚拟环境中使用的Python版本(分别
对应Python3和Python2),或是使用–python选项指定具体的版本号。同时要确
保对应版本的Python已经安装在电脑中。
在单独使用Virtualenv时,我们通常会显式地激活虚拟环境。在Pipenv中,可
以使用pipenv shell命令显式地激活虚拟环境:
$ pipenv shell
Loading .env environment variables…
Launching subshell in virtual environment. Type 'exit' to return.

阅读全文 »

1
2
hexo backup --init #初始化备份
hexo backup #备份操作

1
2
3
4
5
6
7
MySql的部署
docker pull mysql:5.6
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /www/mysql:/var/lib/mysql --name mysql mysql:5.6
docker exec -it mysql bash
mysql -u root -p
use mysql;
update user set host = "%" where user = "root";
阅读全文 »