Flask之视图,会话、模板

一、视图

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

原文地址:https://www.cnblogs.com/huiyichanmian/p/12274357.html

时间: 2024-10-31 11:44:18

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

【Flask教程11】模板

基本使用 过滤器&自定义过滤器 控制代码块 宏.继承.包含 Flask 的模板中特有变量和方法 web表单 CSRF 学习目标 能够写出 jinja2 中变量代码块和控制代码块的格式 能够写出在模板中字典,列表的取值方式 能够写出数组反转的自定义过滤器(使用1种方式即可) 能够说出Flask中模板代码复用的三种方式 能够使用代码实现模板继承的功能 能够说出可以在模板中直接使用的 Flask 变量和函数 能够使用 Flask-WTF 扩展实现注册表单 能够说出 CSRF 攻击的原理 一.Jinja

理解模型,视图,模板

分层(MVC)Model-View-Controller 把一个应用程序以MVC分成几个不封可以给予程序员足够的灵活性,并且鼓励重用diamante.成功的实施了MVC架构的关键在于要正确地分割应用程序的不同层次.芮然在某些情况下,在数据模型里存放如何显示它的信息是贪图一些方便,但是却给将来替换视图带来了极大的困难.同样,在图形布局的代码里放置数据库相关的代码会在替换数据库平台的时候让你头疼不已.------------------------------------Django Django也

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

在用 Backbone 开发的 JavaScript 应用里面,除了模型与集合以外,另一个重要的部分就是视图,英文是 View .在视图里面,我们可以去监听在页面上发生的事件,还有与视图相关的模型和集合的事件,可以去定义处理这些事件用的方法,可以设置包装数据用的元素等等. 模型视图 下面, 先去为 Todo 这个模型的数据创建一个视图,定义这个视图的代码放在 js/Views/TodoView.js 这个文件里面.打开这个文件,输入下面这些代码: var app = app || {}; /**

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

Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test), #url(r'^home', views.Test.as_view()), views.py: def test(request): print(request.method) return render(request, "home.html") """

Part3:视图和模板

一.简述 一个视图就是一个页面,通常提供特定的功能,使用特定的模板.例如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 博客主页:显示最新发布的一些内容 基于年的博客页面:显示指定年内的所有博客文章 基于月的博客页面:显示指定月内的所有博客文章 基于天的博客页面:显示指定日内的所有博客文章 发布评论:处理针对某篇博客发布的评论 二.编写视图 下面,打开polls/views.py:文件,输入下列代码 from django.shortcuts import rend

视图调用模板

调用模板分为三步 找到模板 定义上下文 渲染模板 from django.http import HttpResponse from django.template import loader,RequestContext def index(request): # 1.获取模板 template=loader.get_template('booktest/index.html') # 2.定义上下文 context=RequestContext(request,{'title':'图书列表',

Django框架(四):视图、模板

1. 视图 后台管理页面做好了,接下来就要做公共访问的页面了.当我们刚刚在浏览器中输入http://127.0.0.1:8000/admin/之后,浏览器显示出了后台管理的登录页面,那么服务器是如何找到这个页面并返回的呢./admin/是我们想要请求的页面,服务器在收到这个请求之后,就一定对应着一个处理动作,这个处理动作就是帮我们产生页面内容并返回回来,这个过程是由视图来做的. 对于django的设计框架MVT,用户在URL中请求的是视图,视图接收请求后进行处理,并将处理的结果返回给请求者. 1

11.3 Flask 视图,模板

视图 FBV def index(nid): """ 请求相关信息 * request.method * request.args * request.form * request.values * request.cookies * request.headers request.path request.full_path request.script_root request.url request.base_url request.url_root request.h

13.django入门01(django入门初探视图,模板,路由)

一.django的基本使用流程. pip install django #安装django 创建一个project: django-admin startproject mysite ---mysite ---settings.py ---url.py ---wsgi.py ---- manage.py(启动文件) 给项目起名字: python mannage.py startapp  app01 django-admin.py 是Django的一个用于管理任务的命令行工具,manage.py是