一、视图

1、route

(1)路由:  

 将从客户端发送过来的请求分发到指定函数上

(2)语法:

@app.route(‘/rule/’)
def hello():
return ‘Hello World!’ @app.route(‘/rule/<id>/’)
def hello(id):
return ‘Hello{}’.format(id)

(3)route规则

写法
<converter:variable_name> converter类型
string 接收任何没有斜杠(‘/’)的文件(默认)
int 接收整型
float 接收浮点型
path 接收路径,可接收斜线(’/’)
uuid 只接受uuid字符串,唯一码,一种生成规则
any 可以同时指定多种路径,进行限定
@blue.route('/getany/<any(a, b):an>/')
def get_any(an): print(an) print(type(an)) return 'Any succes'

(4)请求方法

@app.route(‘/rule/’,methods=[‘GET’,’POST’])
def hello():
return ‘LOL’

methods中指定请求方法:
  GET
  POST
  HEAD
  PUT
  DELETE

@blue.route('/getrequest/', methods=["GET", "POST", "PUT", "DELETE"])
def get_request(): print(request.host) print(request.url) if request.method == "GET":
return "GET Success %s" % request.remote_addr
elif request.method.lower() == "post":
return "POST Success"
else:
return '%s Not Support' % request.method

(5)反向解析url_for

根据函数名,获取反向路径

url_for('函数名', 参数名=value)  # 如果是用蓝图,则蓝图名.函数名
@blue.route('/redirect/')
def red():
# return redirect('/')
return redirect(url_for('blue.get_any', an='a'))

2、request

服务器在接收到客户端的请求后,会自动创建Request对象

由Flask框架创建,Request对象不可修改

(1)属性

  url 完整请求地址
  base_url 去掉GET参数的URL
  host_url 只有主机和端口号的URL
  path 路由中的路径
  method 请求方法
  remote_addr 请求的客户端地址
  args GET请求参数,并不是get专属,所有请求都能获取这个参数
  form POST请求参数,直接支持put和patch
  files 文件上传
  headers 请求头
  cookies 请求中的cookie

(2)ImmutableMultiDict

类似字典的数据结构,与字典的区别,可以存在相同的键

args和form都是ImmutableMultiDict的对象

ImmutableMultiDict中数据获取方式:

dict['uname'] 或 dict.get('uname)

获取指定key对应的所有值:

dict.getlist('uname')

3、response

服务器返回会给客户端的数据,由程序员创建,返回Response对象

(1)返回方式

a、直接返回Response对象   
from flask import Blueprint, render_template, request, Response

blue = Blueprint('app', __name__)

@blue.route('/getresponse/')
def get_response():
return Response("自己造一个DIY")
b、通过make_response(data,code)

    - data 返回的数据内容
    - code 状态码

@blue.route('/getresponse/')
def get_response():
response = make_response("<h2>哈哈哈</h2>")return response
c、返回文本内容,状态码
@blue.route('/getresponse/')
def get_response(): return 'Hello Sleeping', 400
d、返回模板(本质和3一样)
@blue.route('/getresponse/')
def get_response():
result = render_template('h1.html')
return result

(2)重定向  

@blue.route('/getresponse/')
def get_response():
return redirect(url_for('app.hi'))

(3)终止处理以及异常捕获

a、终止执行(主动终止)
abort(code)  #code只能是系统定义的错误码
b、捕获异常
@app.errorhandler(404)
def hello():
return ‘LOL’
完整示例:
@blue.route('/getresponse/')
def get_response():
abort(404)
return redirect(url_for('app.hi')) @blue.errorhandler(404)
def hello(e):
return "这是异常页面 %s" % e

二、会话

1、cookie

客户端端的会话技术,flask中的cookie默认对中文等进行了处理,直接可以使用中文

cookie本身由浏览器保存,通过Response将cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来

response.set_cookie(key,value[,max_age=None,exprise=None)]
request.cookie.get(key)

max_age: 整数,指定cookie过期时间
expries : 整数,指定过期时间,可以指定一个具体日期时间

max_age和expries两个选一个指定

过期时间的几个关键时间
  max_age 设置为 0 浏览器关闭失效
  设置为None永不过期

删除cookie

response.delete_cookie(key)

cookie不能跨域名

cookie不能跨浏览器

@blue.route('/login/', methods=[ "POST"])
def login():
username = request.form.get("username")
response = Response("登录成功%s" % username)
response.set_cookie('username', username)
return response

@blue.route('/mine/')
def mine():
username = request.cookies.get('username')
return '欢迎回来:%s' % username

2、session

服务端会话技术,数据存储在服务器,在flask中,将session存在cookie中,对数据进行序列化,base64,zlib压缩,产地了hash.

flask-session实现了服务端session,将数据存储服务端,将数据对应的key存储在cookie中

默认过期时间是31天

@blue.route('/login/', methods=[ "POST"])
def login():
username = request.form.get("username")
response = Response("登录成功%s" % username)
session['username'] = username
session['password'] = "110"
return response @blue.route('/mine/')
def mine():
username = session.get('username')
return '欢迎回来:%s' % username

注意:在flask中使用session需要设置SECRET_KEY(在配置文件中)

将session存入到redis中

class Config:
DEBUG = False
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = "Rockdafafafafafa"
# 将session存储在redis中
SESSION_TYPE = "redis"
REDIS_HOST = "110.110.110.110"
REDIS_PORT = "6379"
REDIS_DB = 0
# session长期有效,则设定session生命周期,整数秒
ERMANENT_SESSION_LIFETIME = 24 * 60 * 60
# 是否强制加盐,混淆session
SESSION_USE_SIGNER = True
# sessons是否长期有效,false,则关闭浏览器,session失效
SESSION_PERMANENT = False
SESSION_REDIS = StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
SESSION_COOKIE_SECURE = True

三、模板

1、jinjia2

Flask中使用Jinja2模板引擎,Jinja2由Flask作者开发一个现代化设计和友好的Python模板语言,模仿Django的模板引擎

优点:
  速度快,被广泛使用
  HTML设计和后端Python分离  
  减少Python复杂度
  非常灵活,快速和安全
  提供了控制,继承等高级功能

2、模板中的语法   

(1)变量

模板中的变量 {{ var }},视图传递给模板的数据前面定义出来的数据变量不存在,默认忽略

(2)标签

模板中的标签{% tag  %}

控制逻辑

使用外部表达式

创建变量

宏定义

@blue.route('/students/')
def students():
student_list = ["小明 %d" % i for i in range(10)]
return render_template('Students.html', student_list=student_list, a=5, b=5)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>StudentList</title>
</head>
<body> <ul>
{% for student in student_list %}
<li>{{ student }}</li>
{% endfor %}
</ul> <hr> {% if a==b %}
<h1>这这是条件判断</h1>
{% endif %} <hr> </body>
</html>

3、结构标签

(1)block

{% block xxx %}

{% endblock %}

块操作

父模板挖坑,子模板填坑

(2)extends

{% extends ‘xxx’ %} 继承后保留块中的内容 {{ super() }}

挖坑填坑体现的是化整为零的效果

(3)include

{% include ’xxx’ %} 包含,将其他html包含进来,体现的是由零到一的概念 (4)marco

{% marco hello(name) %} {{ name }} {% endmarco %} 宏定义,可以在模板中定义函数,在其它地方调用   宏定义可导入 {% from ‘xxx’ import xxx %}

{% extends 'user/base_user.html' %}

{% block header %}
{% include 'banner.html' %}
{% endblock %} {% block content %} <h2>这是用户注册的内容</h2> {% macro hello() %}
<h3>这是一个macro</h3>
{% endmacro %} {{ hello() }}
{{ hello() }}
{{ hello() }}
{{ hello() }}
{{ hello() }}
{{ hello() }}
{{ hello() }}
{{ hello() }}
{{ hello() }} {% endblock %}

4、循环

for

{% for item in cols %}

AA

{% else %}

BB

{% endfor %}

可以使用和Python一样的for…else

也可以获取循环信息 loop

  loop.first

  loop.last

  loop.indexloop.index0

  loop.revindexloop.revindex0

5、过滤器

语法

{{  变量|过滤器|过滤器… }}

  capitalize

  lower

  upper

  title

  trim

  reverse

  format

  striptags 渲染之前,将值中标签去掉

  safe

  default

  last

  first

  length

  sum

  sort

6、模板路径以及静态资源路径

(1)、模板

模板路径默认在Flask(app)创建的路径下,如果想自己指定模板路径,在Flask创建的时候,指定template_folder,同时也可以在蓝图创建的时候,指定template_folder,蓝图也可以指定统一前缀/xx。

模板中模板中使用反向解析和在python代码中一样,使用url_for

(2)、静态资源

静态资源在Flask中是默认支持的,默认路径在和Flask同级别的static中,想要自己指定可以在Flask创建的时候指定 static_folder,也可以在蓝图中指定,静态资源也是有路由的endpoint是 static,参数有一个filename

{{ url_for('static', filename='xxx') }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
{# <link rel="stylesheet" href="/static/css/hi.css">#}
<link rel="stylesheet" href="{{ url_for('static', filename='css/hi.css') }}">
</head>
<body>
<h1>天气寒冷</h1>
<ul>
<li>今天雾霾</li>
<li>下雨了</li>
<li>{{ msg }}</li>
</ul>
</body>
</html>

Flask之视图,会话、模板的更多相关文章

  1. Python框架学习之Flask中的Jinja2模板

    前面也提到过在Flask中最核心的两个组件是Werkzeug和Jinja2模板.其中Werkzeug在前一节已经详细说明了.现在这一节主要是来谈谈Jinja2模板. 一.为什么需要引入模板: 在进行软 ...

  2. Flask之视图(一)

    2.关于Flask 知识点 从Hello World开始 给路由传递参数 返回状态码 重定向 正则URL 设置cookie和获取cookie 扩展 上下文 请求钩子 Flask装饰器路由的实现 Fla ...

  3. Flask开发系列之模板

    Flask开发系列之模板 本文对<FlaskWeb开发:基于python的Web应用开发实战>模板一节做的总结. Jinja2模板引擎 模板 模板是一个包含响应文本的文件,其中包含用占位变 ...

  4. JavaScript 应用开发 #2:视图与模板

    在用 Backbone 开发的 JavaScript 应用里面,除了模型与集合以外,另一个重要的部分就是视图,英文是 View .在视图里面,我们可以去监听在页面上发生的事件,还有与视图相关的模型和集 ...

  5. Part 3:视图和模板--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  6. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  7. 五、Django之视图和模板-Part 3

    一.概述 一个视图就是一个页面,通常提供特定的功能,使用特定的模版.列如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 每篇博客的详细页面:博客的永久链接 基于年的博客页 ...

  8. flask基础之jijia2模板语言进阶(三)

    前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...

  9. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  10. ThinkPHP5.0框架开发--第9章 TP5.0视图和模板

    ThinkPHP5.0框架开发--第9章 TP5.0视图和模板 第9章 TP5.0视图和模板 ===================================================== ...

随机推荐

  1. [Qt 基础-03] QRadioButton

    QRadioButton基础 本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QRadioButton的功能以及使用 文章目录 QRadioButton基础 简介 autoExclusive ...

  2. go 简单封装数学运算包

    前言 我们在编写程序时,经常会遇到一些高精度的数学运算,这时候使用简单的运算符会造成精度的缺失. 这里引用了这个第三方包 https://github.com/shopspring/decimal 做 ...

  3. 网页P图

    此篇文章记录一段比较好玩的网页P图代码 1.在你要修改的网页上Fn + F12或者F12打开控制台,然后在console里输入这样一段代码,回车 document.designMode = 'on' ...

  4. 正反代理-nginx安装

    参考文章:https://www.cnblogs.com/ysocean/p/9384877.html 先预祝一下成功 废话不多说,开始吧,步骤不多 下载地址 https://nginx.org/en ...

  5. 解密prompt系列52. 闲聊大模型还有什么值得探索的领域

    在DeepSeek-R1的开源狂欢之后,感觉不少朋友都陷入了技术舒适区,但其实当前的大模型技术只是跨进了应用阶段,可以探索的领域还有不少,所以这一章咱不聊论文了,偶尔不脚踏实地,单纯仰望天空,聊聊还有 ...

  6. idea远程访问docker查看控制台中文乱码问题

    今天心血来潮想把自己的项目部署到docker,部署完成后通过idea远程访问docker.发现控制台日志出现中文乱码,起初还以为docker或者项目编码没有设置好,一一排查后发现服务器编码和环境都没有 ...

  7. 🎀springboot banner介绍及使用

    简介 Banner是指应用程序启动时显示的信息.对于Spring Boot应用来说,默认情况下,当你启动一个 Spring Boot应用时,控制台上会打印出一段由 Spring Boot自带的ASCI ...

  8. Asp.net mvc基础(十四)Entity Framework

    一.EntityFramework介绍 1.ORM:Object Relation Mapping,用操作对象的方式来操作数据库 2.ORM工具有很多,其中Dapper.PetaPoco.NHiber ...

  9. Golang解决fatal error: all goroutines are asleep - deadlock!

    今天进行一个协程操作demo时总是报错 //workerpool.go package main import ( "fmt" "time" ) //工作线程 ...

  10. Sentinel源码—8.限流算法和设计模式总结

    大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器:缓存.降级和限流.限流就是通过限制请求的流量以达到 ...