flask入门

Flask入门

Flask入门WEB工作原理Flask框架flask_script扩展蓝本(blueprint)

WEB工作原理

C/S和B/S架构  c:client s:server  b:browser s:server

B/S工作原理

客户端(浏览器) <=> WEB服务器(nginx/apache) <=> Python(Flask) <=> 数据库(MySQL)

Flask框架

简介

是一个非常小的python web框架,被称为微型框架,只提供了一个强健的核心,其它的功能都要使用扩展来实现。意味着可以根据自己的项目需求量身打造。遵循BSD证书。

官网 http://flask.pocoo.org/

附各种证书说明:


组成

调试、路由、WSGI系统

模板引擎(Jinja2,Flask的核心人员开发)

安装

mkvirtualenv -p C:\Users\My\AppData\Local\Programs\Python\Python36\python.exe flaskenv

pip install flask -i https://pypi.douban.com/simple/

Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 套件

第一个程序

# 导入Flask类库

fromflaskimportFlask

# 创建应用实例

app=Flask(__name__)

# 创建视图函数

@app.route('/')

defindex():

return'Hello Flask !'

# 启动应用实例

if__name__=='__main__':

app.run()

默认访问地址:http://127.0.0.1:5000

启动参数

参数说明

debug是否开启调试模式,开启后有错误提示,代码修改后可以重新启动

threaded开启多线程,默认是不开启的

port指定端口号

host指定主机,设置为‘0.0.0.0’后可以通过ip地址进行访问

请求与响应

变量或对象

什么是“上下文”

一个单独的存储区域,接收和调用到各个范围传递过来的属性,这就是所谓的”上下文

Flask中的上下文

为了避免大量可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为“全局访问”

变量/对象上下文说明

current_app程序上下文当前运行的程序实例

g(global的简写)程序上下文处理请求时用作临时存储的对象,专门用来保存用户数据,每次请求都会重置,g对象在一次请求中的所有代码中都是可以使用的。

request请求上下文请求对象,保存了客户端的所有的HTTP请求信息

session请求上下文用户会话,用于保存需要'记住'的会话信息

这里的request属于请求上下文,请求对象,封装了客户端发出的HTTP请求中的内容,距离说明:假设前端使用ajax带参数 data:{a:b} 请求一个后端接口,我们用Python写的后端接口就可以使用request这个“全局变量”来获取ajax的请求数据,如果接口是post,put类型,则可以使用

data = request.form

获取,如果是get请求,则是可以使用

data=request.args

请求钩子函数

fromflaskimportFlask,g

app=Flask(__name__)

@app.route('/test/')

deftest():

returng.string

@app.before_first_request

defbf_first_request():

    g.string='before_first_request'


@app.before_request

defbf_request():

    g.string='before_request'

  # 注册一个函数,没有异常情况下,在每次请求之后运行.

  # 注册的函数至少需要含有一个参数

  # 这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.

  @app.after_request

  def af_request(param):

     param.set_cookie('username', 'xiaoming')

     return param

  ```

函数描述

before_first_request第一次请求之前

before_request每次请求之前

after_request没有异常情况下,每次请求之后

teardown_request每次请求之后,无论是否有异常,常用于关闭数据库连接

视图函数

不带参数的视图函数,见《完整程序》

带参数的视图函数,如下:

# 带参数的路由,不指定参数类型,默认是字符串

@app.route('/hello//')

defhello(username):

return'Hello %s !'%username


# 参数可以指定类型:int、float、path(/不再是分隔符)

@app.route('/user//')

defuser(uid):

return'%d号用户详细信息'%uid

@app.route('/path//')

defpath(p):

returnp

总结说明

若指定参数,需要将参数外添加<>,且路由参数名称要与视图函数参数一致

参数可以指定类型,如:string、int、float、path,不指定默认为字符串

路由中的最后的'/'最好还是加上

请求(request)

@app.route('/request/')

defreq():

# 完整的请求URL

# return request.url

# 基本路由信息,不包含get参数

#return request.base_url

# 只包含主机和端口

#return request.host_url

# 只包含装饰器中的路由地址

#return request.path

# 请求方法类型

#return request.method

# 客户端IP地址

#return request.remote_addr

# 所有的请求参数(GET)

#return request.args['page']

# 返回一个列表

# returen str(request.args.getlist('username'))

# 请求头信息

returnrequest.headers['User-Agent']

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

Mozilla/5.0 :以前用于Netscape浏览器,目前大多数浏览器UA都会带有。

Windows NT 6.1:代表windows7系统。

WOW64:Windows-on-Windows 64-bit,32位的应用程序运行于此64位处理器上。

AppleWebKit/537.36:浏览器内核。

KHTML:一个HTML排版引擎。

like Gecko:这不是Geckeo 浏览器,但是运行起来像Geckeo浏览器。

Chrome/55.0.2883.87:Chrome版本号。

Safari/537.36:宣称自己是Safari?

响应(response)

@app.route('/response/')

defresponse():

# 只要返回字符串就可以,默认状态码为200

#return 'ok'

# 可以指定状态码

#return 'page not found', 404

# 先使用专门的函数构造一个响应,然后返回,可以在构造时指定状态码

resp=make_response('我是提前构造好的响应',404)

returnresp

重定向(redirect)

@app.route('/redirect/')

defnew():

#return 'abc'

#return redirect('/')

# 根据视图函数,反向构造对应的路由,传递的参数是视图函数名

#return redirect(url_for('response'))

# 可以拼接路由参数,多余的参数会以get方式拼接在url后面

#return redirect(url_for('hello', username='xiaoming', page=2))

# 当需要构造外部跳转的链接时,需要将_external设置为True以构造完整路由

returnurl_for('hello',username='xx',_external=True)

  url_for('hello')  ==>/hello/

url_for('hello',_external=True) ==>http://127.0.0.0:5000/hello/

终止(abort)

@app.route('/abort/')

deferr():

# 使用abort不是说控制权归调用的函数所有,

# 而是向系统抛出一个异常,按照系统原有的异常处理方式进行处理

abort(404)

return'error'

# 定制错误显示页面

@app.errorhandler(404)

defpage_not_found(e):

return'老铁,有木有搞错'

课堂练习:定制一个500的错误显示页面。

会话控制(cookie/session)

# 设置cookie

@app.route('/set_cookie/')

defset_cookie():

resp=make_response('cookie已设置')

expires=time.time()+10

# 设置cookie,顺便可以指定过期时间

resp.set_cookie('name','xiaoming',expires=expires)

returnresp

# 获取cookie

@app.route('/get_cookie/')

defget_cookie():

returnrequest.cookies.get('name')or'你是哪个二哥'

# 设置秘钥,此处的秘钥不只是用于session的加密

app.config['SECRET_KEY'] ='123456'

# 设置session

@app.route('/set_session/')

defset_session():

session['username'] ='xiaoma'

return'session已设置'

# 获取session

@app.route('/get_session/')

defget_session():

returnsession.get('username','who are you?')

flask_script扩展

安装:pip install flask-script

说明:

在项目测试完成后,上线时最好不要改动任何代码。只能通过终端的方式进行启动,通过传递不同的参数,完成特定的启动方式。很遗憾flask默认不支持命令行启动,然而幸运(^_^)的是有一个第三方库flask-script帮我们实现了这个功能。简单来说,它就是一个flask终端启动的命令行解析器。

使用:

# 导入类库

fromflask_scriptimportManager

# 创建对象

manager=Manager(app)

# 启动应用实例

if__name__=='__main__':

#app.run(debug=True, threaded=True, port=8000, host='0.0.0.0')

manager.run()

启动参数

-?,--help          # 查看帮助信息

--threaded          # 开启多线程

-d                  # 开启调试模式

-r                  # 自动加载

-h,--host          # 指定主机

-p,--port          # 指定端口

在命令行使用

python manage.py runserver -d -r -p 8000 -h 0.0.0.0

蓝本(blueprint)

说明:

代码越来越复杂时,将所有的视图函数放在一个文件中是很不合理的,如果能够根据功能不同将特定的视图函数分类存放,蓝本就是为了解决这个问题而出现的

使用:

# 导入类库

fromflaskimportBlueprint

# 创建对象

user=Blueprint('user',__name__)

@user.route('/register/')

defregister():

return'欢迎注册'

在manage.py中注册蓝本。

# 蓝本注册,不注册时蓝本处于休眠状态 

app.register_blueprint(user,url_prefix='/user')

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

推荐阅读更多精彩内容

  • 最近看了《见字如面》。 看的不多,只看了3期。 但是很喜欢。 第一感觉是,哇,现在都有这么高逼格的节目了。 以前的...
    时光勿念阅读 1,267评论 0 0
  • (2016.11.01)新的一周开始了。本周要阅读一本新书了,每换一本新书总免不了要左挑右选,虽然也有读书计划的书...
    麦思先生阅读 261评论 1 1
  • 克利夫兰骑士客场93-89力克金州勇士,在1-3落后的情况下上演神奇逆转,最终捧起了梦寐以求的总冠军。勒布朗-詹姆...
    主流娱乐圈阅读 180评论 0 0
  • 因为那件事,我曾“恨”过爸爸…… 还记得那是上二年级的时候,学校要举行背古诗比赛,爸爸为了能让我在这次比赛中夺得冠...
    高雅的阅读 206评论 0 0