Flask视图和模板简介

一、url_for

  • 1.作用
    • 将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
    • url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮我们搞定。
  • 2.传参数
    url_for中传递参数是查询字符串,用来指定资源。查询字符串从问号?开始,以键值对的形式写出,多个键值对之间使用&分隔。
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/active/')
def active():
    return url_for('active', name='superman', age=34, heght=191)
if __name__ = '__main__':
    app.run(debug=True)
  • 3.url结尾带'/'
    @app.route('/root/')@app.route('/root')是两个不同的url。不带'/'的url在地址结尾输入'/'时会直接报错,带'/'的url在地址结尾输不输'/'都会自动识别为带'/'。

二、定制http的请求方法

Http协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。
不同的http方法:

序号 方法与描述
1 GET以未加密的形式将数据发送到服务器。最常见的方法。
2 HEAD和GET方法相同,但没有响应体。
3 POST用于将HTML表单数据发送到服务器。POST方法接收的数据不由服务器缓存。
4 PUT用上传的内容替换目标资源的所有当前表示。
5 DELETE删除由URL给出的目标资源的所有当前表示。
    1. POST
      默认情况下,Flask路由响应GET请求。但是,可以通过为route()装饰器提供方法参数来更改此首选项。
      为了演示在URL路由中使用POST方法,首先让我们创建一个HTML表单,并使用POST方法将表单数据发送到URL。
      将以下脚本另存为login.html
<html>
   <body> 
      <form action = "http://localhost:5000/login" method = "post">
         <p>Enter Name:</p>
         <p><input type = "text" name = "nm" /></p>
         <p><input type = "submit" value = "submit" /></p>
      </form>
   </body>
</html>

现在在Python shell中输入以下脚本:

from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/success/<name>')
def success(name):
   return 'welcome %s' % name
@app.route('/login',methods = ['POST', 'GET'])
def login():
   if request.method == 'POST':
      user = request.form['nm']
      return redirect(url_for('success',name = user))
   else:
      user = request.args.get('nm')
      return redirect(url_for('success',name = user))
if __name__ == '__main__':
   app.run(debug = True)

开始运行后,在浏览器中打开login.html,在文本字段中输入name,然后单击提交。表单数据将POST到表单标签的action子句中的URL。http://localhost/login映射到login()函数。由于服务器通过POST方法接收数据,因此通过以下步骤获得从表单数据获得的“nm”参数的值:
user = request.form['nm']它作为变量部分传递给'/ success' URL。浏览器在窗口中显示welcome消息。

  • 2.GET
    在login.html中将方法参数更改为'GET',然后在浏览器中再次打开它。服务器上接收的数据是通过GET方法获得的。通过以下的步骤获得'nm'参数的值:User = request.args.get(‘nm’)这里,args是包含表单参数对及其对应值对的列表的字典对象。与'nm'参数对应的值将像之前一样传递到'/ success' URL。

三、网页跳转和重定向

重定向分为暂时性重定向和永久性重定向,也就是在浏览器上会自动跳转到另一个页面。

  • 1.永久性重定向: http 的状态码是 301 ,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,输入 www.jingdong.com 的时候,会被重定向到 www.jd.com
  • 2.暂时性重定向:http 的状态码是 302 ,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
  • 3.Flask中的重定向
    重定向是通过 redirect(location,code=302) 这个函数来实现的。location 表示需要重定向到的 URL,应该配合之前讲的 url_for()函数来使用。code 表示采用哪个重定向,默认是 302( 暂时性重定向 ) ,可以修改成 301来实现永久性重定向。
from flask import Flask,request,url_for,redirect
​app = Flask(__name__)
​@app.route('/')
def hello_world():
    return 'Hello World!'
​# 登录界面
@app.route('/login/')
def login():
    return '请登录'
​# 页面跳转,暂时性重定向302   永久性重定向301
@app.route('/profile/')
def profile():
    if request.args.get('name'):
        return '用户中心页面'
    else:
        return redirect(url_for('login'),code=302)
​if __name__ == '__main__':
    app.run()

四、关于Response响应

视图函数的返回值

  • 1.字符串。return '字符串'
  • 2.元祖。return '字符串', '状态码'
  • 3.字典。return 字典
  • 4.Response。return Response('字符串', '状态码', mimetype = 'text/plain')
  • 5.make_response。return make_response('字符串')

五、flask模板介绍

使用render_template方法可以轻松调用模板,需要传入两个参数,模板名称和模板使用的数据对象。使用之前需要导入render_template方法:

from flask import Flask,url_for,render_template

模板文件需要存放在flask程序文件所在目录的上级目录下的templates文件夹下,flask才能获取该模板文件。
比如我们在templates文件夹下新建一个hello.html的模板,复制如下代码。

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello World!</h1>
{% endif %}

在使用如下代码调用模板。

@app.route("/tmpl")
def renderTmpl():
    return render_template("hello.html",name="Hello Tmpl")

六、flask模板传参

  • 1.以关键字参数的形式传
@app.route('/')
def index():
return render_template('/index.html', name='zhangsan')

页面模板中使用{{ }}接收,{{ }}表示包裹的是一些数据变量,上面方法对应的接收方式为:<li>{{ name }}</li>

  • 2.我们通常会传递一组数据,例如我们传递一个字典。
@app.route('/')
def index():
    context = {
                 username = 'tom', 
                 age = 32,
                 skill = {1:'python', 2:'html', 3:'ccs'}
}
    return render_template('/index.html', context=context)

上面方法对应的接收方式为:<li>{{ context.username }}</li>

  • 3.常用的传递参数方法。用解包的方式传参。
@app.route('/')
defindex():
context={
                 username = 'tom',
                 age = 32,
                 skill = {1:'python', 2:'html', 3:'ccs'}
}
returnrender_template('/index.html', **context)

上面方法对应的接收方式为:

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