2019独角兽企业重金招聘Python工程师标准>>>

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。

安装

pip install Flask

werkzeug:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from werkzeug.wrappers import Request, Response@Request.application
def hello(request):return Response('Hello World!')if __name__ == '__main__':from werkzeug.serving import run_simplerun_simple('localhost', 4000, hello)

一、第一次

from flask import Flask
app = Flask(__name__)@app.route("/")
def hello():return "Hello World!"if __name__ == "__main__":app.run()

二、路由系统

  • @app.route('/user/<username>')

  • @app.route('/post/<int:post_id>')

  • @app.route('/post/<float:post_id>')

  • @app.route('/post/<path:path>')

  • @app.route('/login', methods=['GET', 'POST'])

常用路由系统有以上五种,所有的路由系统都是基于以下对应关系来处理:

DEFAULT_CONVERTERS = {'default':          UnicodeConverter,'string':           UnicodeConverter,'any':              AnyConverter,'path':             PathConverter,'int':              IntegerConverter,'float':            FloatConverter,'uuid':             UUIDConverter,
}

注:对于Flask默认不支持直接写正则表达式的路由,不过可以通过自定义来实现,见:https://segmentfault.com/q/1010000000125259

三、模板

1、模板的使用

Flask使用的是Jinja2模板,所以其语法和Django无差别

2、自定义模板方法

Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render_template,如:

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title></title>
</head>
<body><h1>自定义函数</h1>{{ww()|safe}}</body>
</html>
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask,render_template
app = Flask(__name__)def wupeiqi():return '<h1>Wupeiqi</h1>'@app.route('/login', methods=['GET', 'POST'])
def login():return render_template('login.html', ww=wupeiqi)app.run()

四、公共组件

1、请求

对于Http请求,Flask会讲请求信息封装在request中(werkzeug.wrappers.BaseRequest),提供的如下常用方法和字段以供使用:

request.method
request.args
request.form
request.values
request.files
request.cookies
request.headers
request.path
request.full_path
request.script_root
request.url
request.base_url
request.url_root
request.host_url
request.host

表单处理Demo

@app.route('/login', methods=['POST', 'GET'])
def login():error = Noneif request.method == 'POST':if valid_login(request.form['username'],request.form['password']):return log_the_user_in(request.form['username'])else:error = 'Invalid username/password'# the code below is executed if the request method# was GET or the credentials were invalidreturn render_template('login.html', error=error)

上传文件Demo

from flask import request
from werkzeug import secure_filename@app.route('/upload', methods=['GET', 'POST'])
def upload_file():if request.method == 'POST':f = request.files['the_file']f.save('/var/www/uploads/' + secure_filename(f.filename))...

Cookie操作

from flask import request@app.route('/setcookie/')
def index():username = request.cookies.get('username')# use cookies.get(key) instead of cookies[key] to not get a# KeyError if the cookie is missing.from flask import make_response@app.route('/getcookie')
def index():resp = make_response(render_template(...))resp.set_cookie('username', 'the username')return resp

2、响应

当用户请求被开发人员的逻辑处理完成之后,会将结果发送给用户浏览器,那么就需要对请求做出相应的响应。

a.字符串

@app.route('/index/', methods=['GET', 'POST'])
def index():return "index"

b.模板引擎

from flask import Flask,render_template,request
app = Flask(__name__)@app.route('/index/', methods=['GET', 'POST'])
def index():return render_template("index.html")app.run()

c.重定向

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask, redirect, url_for
app = Flask(__name__)@app.route('/index/', methods=['GET', 'POST'])
def index():# return redirect('/login/')return redirect(url_for('login'))@app.route('/login/', methods=['GET', 'POST'])
def login():return "LOGIN"app.run()

d.错误页面

指定URL,简单错误

from flask import Flask, abort, render_template
app = Flask(__name__)@app.route('/e1/', methods=['GET', 'POST'])
def index():abort(404, 'Nothing')
app.run()
from flask import Flask, abort, render_template
app = Flask(__name__)@app.route('/index/', methods=['GET', 'POST'])
def index():return "OK"@app.errorhandler(404)
def page_not_found(error):return render_template('page_not_found.html'), 404app.run()

e.设置相应信息

使用make_response可以对相应的内容进行操作

from flask import Flask, abort, render_template,make_response
app = Flask(__name__)@app.route('/index/', methods=['GET', 'POST'])
def index():response = make_response(render_template('index.html'))# response是flask.wrappers.Response类型# response.delete_cookie# response.set_cookie# response.headers['X-Something'] = 'A value'return responseapp.run()

3、Session

除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。

  • 设置:session['username'] = 'xxx'

  • 删除:session.pop('username', None)

from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)@app.route('/')
def index():if 'username' in session:return 'Logged in as %s' % escape(session['username'])return 'You are not logged in'@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))return '''<form action="" method="post"><p><input type=text name=username><p><input type=submit value=Login></form>'''@app.route('/logout')
def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))# set the secret key.  keep this really secret:
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

4.message

message是一个基于Session实现的用于保存数据的集合,其特点是:使用一次就删除

index.html

<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title></title>
</head>
<body>{% with messages = get_flashed_messages() %}{% if messages %}<ul class=flashes>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}{% endwith %}
</body>
</html>
from flask import Flask, flash, redirect, render_template, requestapp = Flask(__name__)
app.secret_key = 'some_secret'@app.route('/')
def index1():return render_template('index.html')@app.route('/set')
def index2():v = request.args.get('p')flash(v)return 'ok'if __name__ == "__main__":app.run()

5.中间件

from flask import Flask, flash, redirect, render_template, requestapp = Flask(__name__)
app.secret_key = 'some_secret'@app.route('/')
def index1():return render_template('index.html')@app.route('/set')
def index2():v = request.args.get('p')flash(v)return 'ok'class MiddleWare:def __init__(self,wsgi_app):self.wsgi_app = wsgi_appdef __call__(self, *args, **kwargs):return self.wsgi_app(*args, **kwargs)if __name__ == "__main__":app.wsgi_app = MiddleWare(app.wsgi_app)app.run(port=9999)

转载于:https://my.oschina.net/lemonwater/blog/1811948

看完这篇文章还能不懂Flask这种Web框架吗?相关推荐

  1. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  2. 我就不信看完这篇你还搞不懂信息熵

    我就不信看完这篇你还搞不懂信息熵 https://mp.weixin.qq.com/s/7NrB0UtmELXD3UNO3C6jGA 让我们说人话!好的数学概念都应该是通俗易懂的. 信息熵,信息熵,怎 ...

  3. logback property 默认值_看完这篇文章还不会给spring boot配置logback,请你吃瓜

    每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定. 放弃不难,但坚持很酷~ 一.logback日志框架 logback 是一个开源的日志组件,由三个部分组成:logback-core,logba ...

  4. 看完这篇文章,还不懂nginx,算我输

    看完这篇文章,还不懂nginx,算我输 参考:https://mp.weixin.qq.com/s/PeNWaCDf_6gp2fCQa0Gvng 1. Nginx产生~ Nginx 同 Apache ...

  5. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  6. 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!

    大家好,我是:じ☆ve朽木,开发经验都是一步一步慢慢积累的,没有谁生来就具有的,只要我们付出了努力,肯定就会有收获!进入我的博客,带你了解Java知识,js小技巧,带你玩转高端物联网.博客地址为:じ☆ ...

  7. [转帖]看完这篇文章你还敢说你懂JVM吗?

    看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...

  8. 神了!!看完这篇文章我不仅学会了手撸vue三开关组件,还搞懂了父子组件传值

    神了!!看完这篇文章我不仅学会了手撸vue三开关组件,还搞懂了父子组件传值 引子 前置知识 什么是vue组件 父子组件传值 父传子 子传父 model选项的引入 三开关组件(three-switch) ...

  9. 看完这篇文章前千万别做微信营销

    不是经常在朋友圈被微信卖货的人刷屏?是不是经常在网上看到微信创业的人月入过万?一夜之间,全世界的人都好像在做微信营销,赚的盆满钵满,你是不是蠢蠢欲动?可大南还是建议你在看完这篇文章之前千万别做微信营销 ...

最新文章

  1. CVPR 2021| 基于深度图匹配的鲁棒点云配准框架
  2. 查看凭证更改记录的三种方式
  3. DM8168 系统编译、启动、烧写
  4. 需要自我总结的知识点
  5. Scrapy爬虫基本使用
  6. Qt 设置窗体或控件渐变消失
  7. 实现安卓里边下边播的播放器(源码公开)
  8. 中国游戏行业观察报告
  9. easyui分页查询为什么会有下拉框_6个针对MySQL大数据量分页查询优化的锦囊妙计...
  10. java clock计时_Java Clock类– java.time.Clock
  11. Golang最佳Web框架对比
  12. 如何macOS 上优雅的使用 Gaussian 09 与GaussView 6
  13. 网狐荣耀6701/6801 手机打包发布
  14. 寻找春天nbsp;九宫格日记-2012.03.09
  15. 像素和厘米怎么换算_像素 amp;amp; 分辨率的那段剪不断理还乱的关系
  16. python实用库之schemdraw不只是绘制原理图
  17. 7.JUC 三大辅助类
  18. Oracle无法标识锁定数据文件,启动错误ORA-01157: 无法标识/锁定数据文件 解决方案...
  19. 大疆2019届秋招笔试--测试工程师
  20. GitHub下载神器,被下架后又复活

热门文章

  1. c++实现KMP算法中的Next[ ]
  2. python代码块使用缩进来表示_Python代码需要缩进吗
  3. python中dtypes_Dataframe创建及index,columns,values,dtypes等属性介绍
  4. 五大领域总目标指南_幼儿教师这样读《指南》事半功倍
  5. 计算机表演赛vr创意大赛,计算机表演赛新增VR创意大赛
  6. linux shell转换时间格式,在bash中转换日期格式
  7. centos 安装java sdk_Linux——CentOS7使用yum命令安装Java SDK
  8. python 投票计数器全班50人3个候选人_Python程序为STV投票系统,为每个人加上所有的第一偏好票...
  9. Java学习笔记2.1.3 Java基本语法 - Java关键字与标识符
  10. 【BZOJ4569】萌萌哒,ST表+并查集