Flask Web框架( 一 )

Flask Web框架入门

1.Flask简介

  • flask是一款非常流行的python Web框架,它出生于2010年,作者是Armin Ronacher。说出来比较让人惊讶,本来这个项目只是作者在愚人节的一个玩笑,后来由于非常受欢迎,进而成为一个正式的项目。
  • 特点:
    • 微框架、简洁、只做他需要做的,给开发者提供了很大的扩展性。
    • Flask和相应的插件写得很好,用起来很爽。
    • 开发效率非常高,比如使用SQLAlchemy的ORM操作数据库可以节省开发者大量书写sql的时间。
  • Flask的灵活度非常之高,他不会帮你做太多的决策,一些你都可以按照自己的意愿进行更改
    • 使用Flask开发数据库的时候,具体是使用SQLAlchemy还是MongoEngine,选择权完全掌握在你自己的手中。区别于Django,Django内置了非常完善和丰富的功能,并且如果你想替换成你自己想要的,要么不支持,要么非常麻烦。
    • 把默认的Jinija2模板引擎替换成其他模板引擎都是非常容易的。

2.安装

  • window安装
pip install flask
  • Linux安装
sudo pip install flask

3.第一个flask程序

 #coding: utf8    

# 从flask框架中导入Flask类
from flask import Flask

# 传入__name__初始化一个Flask实例
app = Flask(__name__)


# app.route装饰器映射URL和执行的函数。这个设置将根URL映射到了hello_world函数上
@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    # 运行本项目,host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000
    app.run(host='0.0.0.0', port=9000)
  • 然后点击运行,在浏览器中输入http://127.0.0.1:9000就能看到hello world了。需要说明一点的是,app.run这种方式只适合于开发,如果在生产环境中,应该使用Gunicorn或者uWSGI来启动。如果是在终端运行的,可以按ctrl+c来让服务停止。

3.1修改flask参数

  • Flask默认使用static目录存放静态资源,templates目录存放模板,这是可以通过设置参数更改的(为了方便别人维护一般不会去修改)
app = Flask(__name__, static_folder="path1", template_folder="path2")
  • 更多参数参考__doc__:
from flask import Flask
print(Flask.__doc__)

3.2 debug模式

  • 默认情况下flask不会开启debug模式,开启debug模式后,flask会在每次保存代码的时候自动的重新载入代码,并且如果代码有错误,会在终端进行提示,开发中需要打开debug模式进行调试,正式运行在服务器上时debug模式别忘了关闭。
  • 开启debug的三种方法:
# 第一种:直接在应用对象上设置
app.debug = True
app.run()

# 第二种:在运行时传入参数进去
app.run(debug=True)

# 第三种:在config属性中设置
app.config.update(debug=True)
app.run()
  • 将debug开启的另一个好处是,程序启动后,会自动检测源码是否发生变化,若有变化则自动重启程序,无需我们重新运行。这可以帮我们省下很多时间。

4.URL与视图

4.1 URL与函数的映射

一个URL要与执行函数进行映射,使用的是@app.route装饰器。@app.route装饰器中,可以指定URL的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL,文章详情的URL是/article/id/,id有可能为1、2、3…,那么可以通过以下方式

@app.route("/article/<id>")
def article(id):
	return '%s article detail' % id
  • 其中,尖括号是固定写法,语法为,variable默认的数据类型是字符串。如果需要指定类型,则要写成converter:variable,其中converter就是类型名称,可以有以下几种:
    • string: 默认的数据类型,接受没有任何斜杠/的字符串。
    • int: 整形
    • float: 浮点型。
    • path: 和string类似,但是可以传递斜杠/。
    • uuid: uuid类型的字符串。
    • any:可以指定多种路径
@app.route('/<any(article,blog):url_path>/')
def item(url_path):
  return url_path
  • 如果不想定制子路径来传递参数,也可以通过传统的?=的形式来传递参数,例如:/article?id=xxx,这种情况下,可以通过request.args.get(‘id’)来获取id的值。如果是post方法,则可以通过request.form.get(‘id’)来进行获取。

4.2构造URL(url_for)

一般我们通过一个URL就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL呢?url_for函数就可以帮我们实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。

  • 通过构建URL的方式而选择直接在代码中拼URL的原因有两点
    • 1 . 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
    • 2 . url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮我们搞定
from flask import Flask,url_for
app = Flask(__name__)

@app.route('/article/<id>/')
def article(id):
    return '%s article detail' % id

@app.route('/')
def index():
    print(url_for("article",id=1))
    return "首页"

4.3指定URL末尾的斜杠

有些URL的末尾是有斜杠的,有些URL末尾是没有斜杠的。这其实是两个不同的URL

@app.route('/article/')
def articles():
    return '文章列表页'

上述例子中,当访问一个结尾不带斜线的URL:/article,会被重定向到带斜线的URL:/article/上去。但是当我们在定义article的url的时候,如果在末尾没有加上斜杠,但是在访问的时候又加上了斜杠,这时候就会抛出一个404错误页面了:

@app.route("/article")
def articles(request):
    return "文章列表页面"

以上没有在末尾加斜杠,因此在访问/article/的时候,就会抛出一个404错误。

  • 在定义时最好统一在末尾加上” / “

4.4指定HTTP方法

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

以上装饰器将让login的URL既能支持GET又能支持POST

4.5页面跳转和重定向

  • 重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
    • 永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
    • 暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。

在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现的,location表示需要重定向到的URL,应该配合之前讲的url_for()函数来使用,code表示采用哪个重定向,默认是302也即暂时性重定向,可以修改成301来实现永久性重定向。

 from flask import Flask,url_for,redirect

 app = Flask(__name__)
 app.debug = True

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

 @app.route('/profile/',methods=['GET','POST'])
 def profile():
     name = request.args.get('name')
     if not name:
         return redirect(url_for('login'), code=301)
     else:
         return name

4.6关于响应(Response)

视图函数中可以返回以下类型的值:

  • Response对象。
  • 字符串。其实Flask是根据返回的字符串类型,重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。
  • 元组。元组中格式是(response,status,headers)。response为一个字符串,status值是状态码,headers是一些响应头。
  • 如果不是以上三种类型。那么Flask会通过Response.force_type(rv,request.environ)转换为一个请求对象。

直接使用Response创建

from werkzeug.wrappers import Response

@app.route('/about/')
def about():
resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
return resp

可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如设置cookie,header信息

from flask import make_response

@app.route('/about/')
def about():
    return make_response('about page')

通过返回元组的形式

@app.errorhandler(404)
def not_found():
    return 'not found',404
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值