Flask Day1

Author: 陈伦巨

Data: 2019-04-05

Email: 545560793@qq.com

github: https://github.com/smartisantt

一、安装环境

1、使用virtualenv安装
  1. 在D盘创建两个文件夹英文名,代码(workspace)和环境(env)两个文件夹
  2. 进入env 文件夹 D: 再输入cd env
  3. pip install virtualenv
  4. 创建一个叫flaskenv的虚拟环境名字 virtualenv --no-site-packages flaskenv
  5. 进入文件cd Scripts
  6. windows下输入 activate激活, Linux系统输入source activate
  7. pip list 或者pip freeze可以查看当前安装环境
  8. 安装pip install flask,也可以批量安装第三方库,新建一个txt文件里面每行写安装的第三方库和对应的版本,在终端进入环境,输入python install -r 文件名
  9. 退出环境deactivate

说明:为什么要使用virtualenv?当你有很多项目,同时使用不同版本的Python和第三库的可能性也就越大。很悲观的是:常常Python或第三方库版本升级,升级后有时不向下兼容。所以,当你创建一个项目的时候,virtualenv为每个项目提供一份Python安装,它并没有真正安装多个Python副本,但是他去世提供了一种巧妙的方式来让各项目环境保持独立。

2、flask的安装与使用

先激活环境,再执行pip install flask

Flask依赖两个外部库:Werkzeug和Jinja2。Werkzeug是一个WSGI(在Web应用和多种服务器之间的标准Python接口)工具集。Jinja2负责渲染模板。

说明:这里使用的Python3.3或更高的版本。

3、启动

有两种启动方式:

第一种:flask自带的启动方式app.run(host, port, debug)

第二种:使用flask_script库启动

  • pip install flask_script

  • from flask_script import Manager
    app = Flask(__name__)
    manage=Manager(app)
    manage.run()
    
  • 在命令行中输入:python xxx.py runserver -h -p -d

二、快速入门

一个最小的 Flask 应用看起来会是这样:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__'
    app.run()

把上面的文件保持为hello.py 文件(或是类似的),然后用Python解释器来运行:

(flask_env) H:\wordspace\flask\flask>python manage.py
 * Serving Flask app "manage" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

注意:确保你的文件名不是flask.py,因为这将与Flask本身冲突。

现在访问 http://127.0.0.1:5000/ ,你会看见 Hello World 问候。

那么上面的代码做了什么?

from flask import Flask导入了Flask类,这个类的实例将会是WSGI应用程序

app = Flask(__name__),创建一个该类的实例,第一个参数是应用模块或者包的名称。如果你使用单一的模块,你应该使用__name__,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 '__main__' 或实际的导入名)。

@app.route('/')装饰器告诉 Flask 什么样的URL 能触发我们的函数。

app.run()函数让应用运行在本地服务器上。其中 if __name__ =='__main__': 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是作为模块导入的时候。

欲关闭服务器,在命令行中按 Ctrl+C。

补充知识:

Python 中有许多web框架,为了更好读兼容性,python定义了web框架和web服务器之间读接口,即

PEP-3333,PEP-333指定了服务器和Python web应用程序或框架之间拟议的标准接口,以促进跨各种web服务器的web应用程序可移植性。

WSGI(全称即:Python Web Server Gateway Interface)

用户(client)发各种请求,发送给server(gateway) 去call Application层(里面有各种各样的object,比如函数,class等),然后在返回个server在返回给user,server和Application中间有middleware(中间件)。

三、调试模式

调试模式:

虽然app.run()方法适用于启动本地的开发服务器,但是你每次修改代码后都要手动重启它。这样并不够优雅。

调试模式绝对不能用于生产环境!!!

在flask自带的启动方式中有两种途径启动调试模式:

第一种:

app.debug = True
app.run()

第二种:

app.run(debug=True)

两种方法的效果完全相同。当你运行程序的时候,修改您的代码然后保存程序会自动重启。

四、路由

route() 装饰器把一个函数绑定到对应的 URL 上。

基本例子:

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'

有变量的路由:

语法:<转化器: 变量名>

转化器有下面几个

转化器类型 说明
int 接受整数
float 接受整数和浮点数
string 指定字符串(默认类型)

<string:name><name>是一样的效果。

@app.route('/echo/<msg>')
def echo(msg):
    return '<h1>Hello, I am a Website I can echo everything: {}</h1>'.format(msg)


@app.route('/post/<int:post_id>')
def show_post(post_id):
    return 'Post %d' % post_id


@app.route('/float/<float:num>')
def float(num):
    return 'float num is : {:.2f}'.format(num)

看看下面的两个例子,虽然它们看起来着实相似,但它们结尾斜线的使用在 URL 定义 中不同。

第一种情况中,指向 projects 的规范 URL 尾端有一个斜线。这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范 URL 去,然而,

第二种情况的 URL 结尾不带斜线,访问结尾带斜线的 URL 会产生一个 404 “Not Found” 错误。

# 第一种情况,URL结尾有斜线
@app.route('/projects/') 
def projects():
    return 'The project page'

# 第二种情况,URL结尾没有斜线
@app.route('/about')
def about():
    return 'The about page'

五、获取请求参数

get和post传参:

HTTP协议未规定GET和POST传参长度的限制,但是浏览器和web服务器对其有限制,不同浏览器和web服务器限制的长度不一样。

get传参格式:127.0.0.1:80/login/?username=ququ&password=123

get是通过路由传参数,?后面的参数无需匹配路由,只匹配?前面的内容。

post传参格式:127.0.0.1:80/login/

post请求传参数,请求参数是放在请求体(body)里面的。比如登录的用户名和密码等重要的内容都用POST传参数。

使用到的工具postman。

获取GET请求参数的内容:

@app.route('/params/')
def params():
    # 获取GET请求传递的参数
    name = request.args['name']     # 获取GET请求的参数没有时会报错
    name = request.args.get('name') # 获取GET请求的参数,使用get方法没有值也不会报错
    age = request.args.get('age')
    return '获取GET请求的参数:name=%s age=%s。'%(name, age)

获取POST请求参数的内容:

# 默认请求方式个GET,设置了POST则无法接受GET请求
@app.route('/post_params/', methods=['POST'])
def post_params():
    name = request.form['name']
    name = request.form.get('name')
    age = request.form.get('age')
    favourites = request.form.getlist('favourite')
    print(favourites)
    return '获取post参数:name=%s age=%s favourite=%s'%(name, age, [favourite for favourite in favourites])

注意:getlist是获取POST请求有很多相同变量名的值,结果以列表返回。应用场景,在前端提交有checkbox的表单时,获取checkbox复选框的值得时候。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容