接着上文

讲一讲响应

flask调用视图函数后,会将其返回值作为响应的内容。大多数情况下,响应就是一个简单的字符串,作为HTML页面回送客户端。但HTTP协议需要的不仅是作为请求响应的字符串。HTTP响应中一个重要的部分是状态码,flask默认设为200,这个代码表明请求被成功处理。如果视图函数返回的响应需要使用不同的状态码,那么可以把数字代码作为第二个返回值,添加到响应文本之后。如下代码

@app.route('/wrong')
def wrong():
return '<h1>Bad Rquest</h1>',400

启动服务后,在浏览器输入url还是能得到返回值的,

但是在cmd里可以看到

如果是正常的返回就是下面那个200,当然除了400外你可以设置成别的,还是会显示出来的

有一种名为重定向的特殊响应类型,这种响应没有页面文档,只告诉浏览器一个新地址用以加载新页面,常用于表单中。常使用302状态码表示,指向的地址有location首部提供。重定向响应可以使用3个值形式的返回值生成,也可以在Response对象中设定。不过由于使用频繁,Flask提供了,redirect()的辅助函数,用于生成这种响应

from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')

之后访问127.0.0.0:5000,他就会指向http://www.example.com/这个页面

上图来自《Flask Web开发:基于Python的Web应用开发实战(第2版)》

之前我们用到的<h1>Hello World!</h1>就是一张jinja2模板,不过相对于return '<h1>Hello,%s !</h1>' %name这样返回name,jinja是这样的<h1>Hello, {{ name }}!</h1>

之前那样的话有点不符合web开发,按道理应该是返回到文本的,我们可以先创建一个templates文件夹,在里面放入index.html和user.html。把上面两句话打进去,然后我们去修改hello.py

from flask import Flask,render_template

@app.route('/')
def index():
return render_template('index.html') @app.route('/user/<name1>')
def user(name1):
return render_template('user.html',name = name1)

保存,然后去访问,会发现得到的效果是一样的。

在user.html文件里有一个{{ name }},表示一种特殊的占位符,jinja2能识别所有类型的变量,甚至是一些复杂的类型,例如列表,字典和对象,如下

<p>A value from a dictionary: {{ mydict['key'] }}.</p>
<p>A value from a list: {{ mylist[3] }}.</p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}.</p>
<p>A value from an object's method: {{ myobj.somemethod() }}.</p>

也可以用过滤器修改变量,过滤器名加载变量名之后,如Hello, {{ name|capitalize }},就是加了一个过滤器。

jinja变量过滤器有以下几个

完整的过滤器列表在这https://jinja.palletsprojects.com/en/2.10.x/templates/#builtin-filters

jinja提供了多种控制结构,举几个简单的例子,

条件控制

<ul>
  {% for comment in comments %}
     <li>{{ comment }}</li>
  {% endfor %}
</ul>

for循环

<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>

还可以把需要重复使用的代码写入单独的文件,然后包含在模板用

{% include 'common.html' %}

当然还可以继承,

<html>
<head>
  {% block head %}
  <title>{% block title %}{% endblock %} - My Application</title>
  {% endblock %}
</head>
<body>
  {% block body %}
  {% endblock %}
</body>
</html>
{% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %}
{{ super() }}
<style>
</style>
{% endblock %} {% block body %}
<h1>Hello, World!</h1>
{% endblock %}

第一段代码就是基代码,第二段是继承之后的代码

说起来django用的应该也是jinja,我一直以为是django特色。。。。

然后用上面那些知识就可以自定义错误页面

@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404 @app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500

这样报错的话就会返回你指定的页面了

在定义动态路由链接的时候我们可以用url_for辅助函数。

他可以直接调用视图里的url,并在上面加上参数。如url_for('index')得到的结果应该是127.0.0.1:5000/如果加上点参数就是这样的url_for('index', page=3),返回结果是/?page=2。

当然还可以这样用('user', name='Red', _external=True),那么返回结果就是127.0.0.1:5000/user/Red这样的了。

flask入门(二)的更多相关文章

  1. flask 入门(二)

    Windows(提前安好virtualenv:pip  install  virtualenv) 一.准备: 1.启动pycharm 2.创建flask项目 二.基本库安装和设置 1.创建沙盒virt ...

  2. Flask入门之结构重组(瘦身)-第13讲笔记

    1. pip list Flask 0.10.1 Flask-Bootstrap 3.3.5.6 Flask-SQLAlchemy 2 Flask-Script 2.0.5 Flask-WTF 0.1 ...

  3. Flask入门之Bootstrap介绍使用和Flask-Nav快速导航栏

    一.Bootstrap Bootstrap,来自 Twitter,是目前最受欢迎的前端框架. Python中,同样可以使用Bootstrap. 1. 导入Bootstrap库 from flask_b ...

  4. Flask 入门一( flask 框架和 flask-script 库)

    Flask 入门一( flask 框架 和 flask-script 库) 一.Flask框架: 1.简介 Flask是一个非常小的Python Web框架,被称为微型框架:只提供了一个稳健的核心,其 ...

  5. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  6. Flask备注二(Configurations, Signals)

    Flask备注二(Configuration, Signals) Flask是一个使用python开发Web程序的框架.依赖于Werkzeug提供完整的WSGI支持,以及Jinja2提供templat ...

  7. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  8. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  9. Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

    原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...

  10. DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

    原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...

随机推荐

  1. Chapter1 递归与递推

    Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...

  2. PS_0001:改变图片颜色 填充颜色

    1,创建新图存  ctrl + j 2,点击前景色按钮,改变颜色 3,前景色的键盘快捷键是“Alt+Delete”,背景色的键盘快捷键是“Ctrl+Delete”

  3. 第一个12PB的项目--2017年

    今年第一个上PB级的项目终于落地.准备了几年,期盼了几年的项目,终于有了市场.内心还是有成就感的. 可是年终沟通,就像是一瓢冷水,从头往下倒.拔凉拔凉的.什么是心寒.什么是希望.想了很多. 我还本想着 ...

  4. 剑指offer-面试题26-树的子结构-二叉树

    /* 题目: 输入两棵二叉树A和B,判断B是不是A的子树. */ /* 思路: 1.注意浮点数大小的判断. 2.判断树A的某个节点是否和树B的根节点是否相同, 若相同,则判断以A该节点为根节点是否包含 ...

  5. cin,cin.get(),cin.getline(),gets(),getchar()函数的用法

    1.cin>> 用法a:最基本的流输入用法,接受一个数字或字符,自动跳过输入的空格. 用法b:接受一个字符串,但是遇到除开头外的空格则会终止输入. #include<iostream ...

  6. c基本语法和数据类型

    一.C语言结构 C 程序主要包括以下部分: 预处理器指令 函数 变量 语句 & 表达式 注释 二.基本语法 1.  分号是语句结束符. 2. 单行注释//.多行注释/* */. 3. 标识符是 ...

  7. Codeforces Round #578 (Div. 2) 二维差分 可做模板

    题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对 ...

  8. gulp常用插件之gulp-filter使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-filter这是一款可以把stream里的文件根据一定的规则进行筛选过滤. 更多使用文档请点击访问gulp-filter工具官网. 安装 ...

  9. ubuntu---禁止更新内核

    系统内核 4.15.0-29  更新成了 4.15.0-88,降级内核并禁止更新内核 查看已安装内核:dpkg --get-selections |grep linux-image 查看正在使用的内核 ...

  10. WeUI基础样式库——写一个移动端界面

    WeUI是一套基础样式库,同微信原生视觉体验一致,由微信官方设计团队为微信内网页和微信小程序量身设计的.我们来看看这个基础库样式到底长什么样. 这些密密麻麻的就是压缩后的样式库.密密麻麻地看起来简直要 ...