FlaskWeb开发

来源:互联网 发布:java trim函数 编辑:程序博客网 时间:2024/05/21 15:04

安装Flask

在命令符窗口中,输入

$python -m venv flask

又陷入了环境安装的麻烦中
https://pypi.python.org/pypi/virtualenv#downloads virtualenv 下载地址
https://virtualenv-chinese-docs.readthedocs.io/en/latest/ virtualenv 使用说明
https://my.oschina.net/lpe234/blog/343639 virtualenv 安装与使用

首先需要安装virtualenv作为虚拟环境,来开发flask。安装virturalenv,说来难,其实很容易。到原网址现在源码安装包,https://pypi.python.org/pypi/virtualenv#downloads
其中有Python wheel 类型文件。也有Source code 类型文件。选择现在源码文件,解压后,
直接执行

$ python setup.py install

在输入

$ virtualenv --version

显示版本号,表示安装成功。

同样的,如果想安装,或者更新pip,也可以直接从官网下载源码,然后直接安装。地址https://pypi.python.org/pypi/pip
直接切换到venv文件夹中,直接安装python setup.py。
安装好virtualenv之后,可以使用它来创建运行flask的虚拟环境。

$ virtualenv venv

稍等片刻,venv文件夹就自动建好了,激动吗?一切才刚刚开始。
其中包含三个文件夹,切换到Scripts中,运行:

$venv\Scripts>avtivate

表示新创建的venv环境被激活,可以使用。

2017.1.28
在家中Lenovo笔记本上安装virtualenv,总是失败,原来是setuptools有问题。

virtualenv test --no-setuptools --no-pip --no-wheel

即可。折腾了我1天。具体原因不详,看到setuptools github issues中很多人在讨论。
https://github.com/pypa/pip/issues/1422
http://bbs.csdn.net/topics/391070795

后续,还是失败,pip install flask setuptools扩展都有问题。
还是老毛病,unicode Error
重新安装python在d盘下,也不可以,不是文件名中有空格的原因,
原来是编码有问题,
在site-package文件夹中增加用户设置文件即可。
一切正常,
参考文章
https://www.v2ex.com/t/90659
由于用户目录由汉字引起的错误。
原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码。解决办法是:
python目录 Python27\Lib\site-packages 建一个文件sitecustomize.py
内容写:
import sys
sys.setdefaultencoding(‘gb2312’)
python会自动运行这个文件。

Flask用到的组件

Jinja2
模板
SQLAlchemy
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.

涉及到的概念

http

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

程序运行

历时半个月,学习到第四章啦,虽然还是不知道学了什么。
第二章时,安装的Flask扩展Flask-Script,为Flask程序添加了一个命令行解释器。运行(启动)Flask程序的命令是:
$python hello.py runserver
第三章 模板
1. 引入Flask框架中,Jinja2模板引擎。

from flask import Flask, render_template
  1. 链接

    • url_for()函数最简单的用法是以视图函数名作为参数,返回对应的URL。例如,在当前版本的hello.py程序中调用url_for(‘index’)得到的结果是/。调用url_for(‘index’,_external=True)返回的则是绝对地址,在这个示例中是http://localhost:500/。
    • 使用url_for()生成动态地址时,将动态部分作为关键字参数传入。例如,url_for(‘user’,name=’john’,_external=True)的返回结果是http://localhost:5000/user/john。
      第四章 Web表单
      Flask-WTF扩展可以把处理Web表单的过程变成一种愉悦的体验。这个扩展对独立的WTFForms(http://wtforms.simplecodes.com)包进行了包装,方便集成到Flask程序中。

第五章 数据库
3. 使用Flask-SQLAlchemy管理数据库
Flask-SQLAlchemy是一个Flask扩展,简化了在Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架,支持多种数据库后台。SQLAlchemy提供了高层ORM,也提供了使用数据库原生SQL的低层功能。

  1. 在签出5b程序后,要想程序正常运行,必须按照前面的章节的方法,在Python shell中创建数据库表。
from hello import dbfrom hello import Role,User

否则程序总是提示Pleased to meet you!,就是数据库没有连接上。

  1. 数据库迁移
    采用程序中的更新数据库,会在迁移脚本中写好需要生成的数据库表内容,使用更新数据库命令upgrade,
(venv)$ python hello.py db upgradeINFO [alebic.migration] Context impl SQLiteImpl.INFO [alembic.migration] Will assume non-transactional DDL.INFO [alembic.migration] Running upgrade None ->1bc594146bb5, initial migration

对于第一个迁移来说,其作用和掉哦那个db.create_all()方法一样,创建一个含有程序定义的数据表的空库,其中并没有数据。但在后续的迁移中,upgrade命令能把改动应用到数据库中,且不影响其中保存的数据。
最后这句话有待研究,做实验时,是直接把原库删除,重新生成了以个数据库,如果更新数据库后,是还是这个数据库,只是里边的内容不一样了,像git一样,能够记录程序的每次变化,回溯到任何一个版本。有待研究。
第六章 电子邮件
Flask-Mail包装了Python标准库中的smtplib包。Flask-Mail连接到简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)服务器,并把邮件交个这个服务器发送。如果不进行配置,Flask-Mail会连接localhost上的端口25,无需验证即可发送电子邮件。

示例6-2

from flask-ext-mail import Mailmail = Mail(app)

这两行代码只是把Flask-Mail模块在flasky应用中应用,初始化。并没有使用它,所以需要在python shell中发邮件。
用户名和密码为了安全,是定义在环境变量中的。可以导入到程序中。关于在shell中设置环境变量,树上写法有误。应该是变量应该使用单引号:

(venv) $ set MAIL_USERNAME = 'Gmail username'(venv) $ set MAIL_PASSWORD = 'Gmail password'

且通过set设置的变量是临时环境变量,在窗口关闭时失效。
参考链接:
http://blog.csdn.net/lagelangzhi/article/details/51717433
1、 根据《Flask Web开发》这本书中第6章关于flask-mail的配置,以下步骤(QQ邮箱配置为例,以下终端的演示均为在mac上进行,linux和win会略有所不同):

hello.py中的配置(以qq邮箱为

import os# ...app.config['MAIL_SERVER'] = 'smtp.qq.com'   app.config['MAIL_PORT'] = 25app.config['MAIL_USE_TLS'] = Trueapp.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <1906242834@qq.com>'app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')

其中用户的邮箱名、密码、以及管理员的邮箱是通过环境变量导入的,以下为终端中的操作:

(venv) $ export MAIL_PASSWORD='xxxxx'  #自己的邮箱客户端登录密码(不同于电脑登录的密码)(venv) $ echo $MAIL_PASSWORD # 打印密码确定导入的密码是否正确         xxxxx(venv) $ export MAIL_USERNAME='2450385291@qq.com' # 自己的邮箱地址(venv) $ echo $MAIL_USERNAME # 打印自己的邮箱地址确认是否正确             2450385291@qq.com(venv) $ export FLASKY_ADMIN='2450385291@qq.com' #导入管理员的邮箱地址(venv) $ echo $FLASKY_ADMIN  # 打印管理员的邮箱地址 1906242834@qq.com

下面简单说下,怎么开启QQ邮箱的SMTP服务(允许在第三方的客户端登录),
登录自己的QQ邮箱 ,在首页点击设置,进入设置选项:
根据提示打开SMTP服务(POP3和IMAP两个都打开)生成授权码,这个授权码就是我们在使用flask-mail时候的用户密码,也是我们在手机客户端登录邮箱时的密码。

5行代码折腾了7个小时,差距太远。
需要注意的问题,
1. Mail_Server地址和端口设置。
2. TLS需要设置成False,否则发不出邮件。
3. Flasky_Mail_sender 需要设置成自己的邮箱地址。

http://www.oschina.net/translate/the-flask-mega-tutorial-part-i-hello-world

1、flask-mail环境变量的导入的优化方法:

使用环境变量导入邮箱的用户名和密码,显然从理论上讲是非常安全的,但是在我们的编码过程中,每次测试都要重复导入,因为终端一旦关闭,那么导入的环境变量就会失效,对于我们来说是十分不方便的,所以小编根据自己的经验,给大家提供一种较为方便的方法。

在hello1.py的同级目录下,新建一个py文件,命名为info.py:
在info.py中写入自己的邮箱用户名和密码:

USERNAME = 'xxxxxxxx@qq.com'PASSWORD = 'yyyyyy'

在hello1.py中的代码如何:

import os# ...from info import USERNAME, PASSWORD #从info.py中导入邮箱账户和密码app.config['MAIL_SERVER'] = 'smtp.qq.com'app.config['MAIL_PORT'] = 25app.config['MAIL_USE_TLS'] = Trueapp.config['MAIL_USERNAME'] = USERNAME  #将邮箱账户赋值app.config['MAIL_PASSWORD'] = PASSWORD  #将邮箱密码进行赋值app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <xxxxxxx@qq.com>'app.config['FLASKY_ADMIN'] = USERNAME

由此就不用每次在终端里进行环境变量的导入了,但是很多朋友可能会想,我的代码是推送到线上的,那我push的时候不就直接推送到github上了,别人不就可以看见我的邮箱和密码了吗(确实有这个问题,小编的邮箱原来就差点泄露过),对于使用github的小伙伴来说,可以设置,对 Git的隐藏文件 .gitignore进行编辑:

(venv) $ vim .gitignore

进入.gitignore文件:

 88 # Rope project settings 89 .ropeproject 90 Status API Training Shop Blog About 91  92 secret.py   # 将你不想git追踪的文件添加到里面 93 info.py

有关详细的git忽略特殊文件的做法,请移步廖雪峰的git教程(忽略特殊文件),关于有朋友使用pycharm集成IDE的,自己查阅相关文档进行设置,在这里不一一赘述了。

第十二章 关注者
checkout新版本,报错,config.py文件被修改过。
是因为配置环境变量,文件被改变,版本控制软件git需要提交新版本,这时候,可以找回原始版本,先更新程序。再替换回来。

phthon manage.py db upgrade
出错,

Only a single head is supported. The script directory has multiple heads (due branching), which must be resolved by manually editing the revision files to form a linear sequence. Run `alembic branches` to see the divergence(s).

原来是在migrate文件夹内,每次upgrade,会更新数据库,通过签出的程序,migrate版本中,更新数据库。然而,每个版本必须是承前启后的链条关系,如果对应不上,就会报错,从而不能更新数据库,这时候,可以手动修改版本衔接关系即可。

部署公司应用,读懂代码后,独自修改的一个程序。
春暖花开的日子里,仿佛又看到了希望。当初强制自己一路看书过来,忍受着独自的枯燥,没想到突然之间自己可以使用框架了。抓紧行动起来。

  1. 首先,需要从Github上clone代码到本地

    $git clone https://github.com/miguelberg/flasky.git
  2. 此时,如果直接运行代码

    $python manage.py runserver

    会得到一连串的错误,因为虚拟运行环境还没有安装,Flask程序运行依赖的扩展程序还没有安装,数据库没有配置,程序配置没有完成。不用着急,切一步步看来,步入网络仙境。

  3. 现在,需要安装一个程序可以运行的虚拟环境venv,

    $ virtualenv venv

    这条命令的前提需要下载并安装virtualenv工具,前文有讲,此处不再赘述。命令后的参数venv代表虚拟环境所在文件夹的名称。

  4. 安装Flask程序所需要的各种扩展程序,

    $ venv/Script activate$ (venv) pip install -r requirements\dev.txt

    activate命令激活python虚拟运行环境。
    这里使用pip工具来安装扩展,需要提前下载安装,同上。

  5. 运行程序后,虽然出错,但是会自动生成一个sqllite数据库,但是数据库是空的,没有表格,需要更新数据库结构,

    $ python manage.py db upgrade
  6. 需要生成Role角色表中的数据,这个已经在程序中编写,执行以下命令:

    $ python manage.py shell$ >>>Role.insert_roles()$ >>>Role.query.all()

    这时数据准备完毕。

  7. 配置文件config.py中,有需要从环境变量中导入的部分,可以新建一个info.py文件,写入需要配置用户邮箱,密码等。

    USERNAME = '*****'     #此处可以写成邮箱地址PASSWORD = '*****'    ...

    用户信息配置好之后,还配置config文件中的邮箱信息,前文有述,不再重复。

到目前为止,程序在本地中基本可以运行。

0 0