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.host_url
    request.host
    request.files
    obj = request.files[‘the_file_name‘]
    obj.save(‘/var/www/uploads/‘ + secure_filename(f.filename))
    """
    dic = {"k1":"v1"}
      """
    返回响应体的4种形式
        字符串
        jsonify
        模板
        url
    """  # return "index"  # return jsonify(dic)
  # return render_template("xxx.html",dic=dic)    # 可带数据传递
  # return redirect(url_for("index"))    # 跳转通过 url_for 反向解析
         """
    定制响应头的时候构造响应体用到 make_response
    """
  # 如果想设置响应头和回显cookie,就需要用到make_response
  # response = make_response(render_template(‘index.html‘))
  # response = make_response("字符串")
  # response是flask.wrappers.Response类型
  # response.delete_cookie(‘key‘)
  # response.set_cookie(‘key‘, ‘value‘)
  # response.headers[‘X-Something‘] = ‘A value‘
  # return response
    from flask import make_response,headers,set_cookie
    obj = make_response(jsonify(dic))
    obj.headers["xxxxx"] = "123"
    obj.set_cookie("key","value")
    return obj

装饰器实现中间件功能

预备处理视图函数初始状态

@app.route(‘/index‘)
def index():
    if not session.get(‘user‘):
        return redirect(url_for(‘login‘))
    return render_template(‘index.html‘,stu_dic=STUDENT_DICT)

视图级别加装,比较适用于对少量视图进行处理

import functools
def auth(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        if not session.get(‘user‘):
            return redirect(url_for(‘login‘))
        ret = func(*args,**kwargs)
        return ret
    return inner

@app.route(‘/index‘)
@auth
def index():
    return render_template(‘index.html‘,stu_dic=STUDENT_DICT)

全局级别加装

@app.before_request
def xxxxxx():
    if request.path == ‘/login‘:
        return None

    if session.get(‘user‘):
        return None

    return redirect(‘/login‘)

除了 before_request 以外还有其他特殊装饰器:

1. before_request    谁先定义谁先执行
    执行多个 before 的时候如果再中间有返回值,对于after 的执行直接执行最后一次定义的那个

2. after_request    谁后定义谁执行 

3. before_first_request

4. template_global

5. template_filter

6. errorhandler

from flask import Flask
app = Flask(__name__)

@app.before_request
def x1():
    print(‘before:x1‘)
    return ‘滚‘

@app.before_request
def xx1():
    print(‘before:xx1‘)

@app.after_request
def x2(response):
    print(‘after:x2‘)
    return response

@app.after_request
def xx2(response):
    print(‘after:xx2‘)
    return response

@app.route(‘/index‘)
def index():
    print(‘index‘)
    return "Index"

@app.route(‘/order‘)
def order():
    print(‘order‘)
    return "order"

if __name__ == ‘__main__‘:

    app.run()

befor/after_request 示例

from flask import Flask
app = Flask(__name__)

@app.before_first_request
def x1():
    print(‘123123‘)

@app.route(‘/index‘)
def index():
    print(‘index‘)
    return "Index"

@app.route(‘/order‘)
def order():
    print(‘order‘)
    return "order"

if __name__ == ‘__main__‘:

    app.run()

before_first_request 示例

@app.errorhandler(404)
def not_found(arg):
    print(arg)
    return "没找到"

errorhandler 示例

CBV

def auth(func):
    def inner(*args, **kwargs):
        result = func(*args, **kwargs)
        return result
    return inner

# 继承自views.MethodView        采用CBV写法时,为了简单,都是采用继承MethodView的方式写的
class IndexView(views.MethodView):
    # methods = [‘POST‘]  #只允许POST请求访问
    decorators = [auth,]  #如果想给所有的get,post请求加装饰器,就可以这样来写,也可以单个指定

    def get(self):   #如果是get请求需要执行的代码
        v = url_for(‘index‘)
        print(v)
        return "GET"

    def post(self):  #如果是post请求执行的代码
        return "POST"

app.add_url_rule(‘/index‘, view_func=IndexView.as_view(name=‘index‘))  #name指定的是别名,会当做endpoint使用
def auth(func):
    def inner(*args, **kwargs):
        print(‘before‘)
        result = func(*args, **kwargs)
        print(‘after‘)
        return result
    return inner

# 也可以再往上继承自View
class IndexView(views.View):
    methods = [‘GET‘]
    decorators = [auth, ]
    # 如果继承自View,就需要dispatch_request
    def dispatch_request(self):
        print(‘Index‘)
        return ‘Index!‘

app.add_url_rule(‘/index‘, view_func=IndexView.as_view(name=‘index‘))  # name=endpoint

模板

基本数据类型

可以执行python语法,如:dict.get(), list[‘xx‘]

比django 更加亲近于 python

传入函数

  • - django,自动执行
  • - flask,不自动执行,需要自己加 " () "

简单的示例

def func1(arg):
    return "hello" + arg

@app.route("/index")
def index():
    return render_template("s5index.html",f=func1)  # 传入函数
<body>
    <!-- 传入函数 -->
    <!-- |safe 防xss攻击 -->
    <h1>{{f(‘羊驼‘)|safe}}</h1> 

</body>

定义函数

@app.template_global()
def sb(a1, a2):
# {{sb(1,9)}}
return a1 + a2

@app.template_filter()
def db(a1, a2, a3):
# {{ 1|db(2,3) }}
return a1 + a2 + a3

模板继承

Flask使用的时Jinja2模板,所以其语法和Django无差别

layout.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>模板</h1>
{% block content %}

{% endblock %}
</body>
</html>

tpl.html

{% extends "layout.html"%}

{% block content %}
{{users.0}}
{% endblock %}

include

用法同django

{% include "form.html" %}

form.html
    <form>
        asdfasdf
    </form>

定制一段 HTML 代码。通过宏可以多次调用,实现冗余代码的封装以及复用性

{% macro ccccc(name, type=‘text‘, value=‘‘) %}
<h1>宏</h1>
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="submit" value="提交">
{% endmacro %}

{{ ccccc(‘n1‘) }}

{{ ccccc(‘n2‘) }}

安全

- 前端:   {{u|safe}}
- 后端:  Markup("<input type=‘text‘ value=%s />"%(arg,))


原文地址:https://www.cnblogs.com/shijieli/p/10354407.html

时间: 2024-10-04 01:27:01

11.3 Flask 视图,模板的相关文章

ThinkPHP框架视图详细介绍 View 视图--模板(九)

原文:ThinkPHP框架视图详细介绍 View 视图--模板(九) 视图也是ThinkPHP使用的核心部分: 一.模板的使用 a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl) -->更换模板文件的后缀名(修改配置文件) 'TMPL_TEMPLATE_SUFFIX'=>'.tpl',//更改模板文件后缀名,默认是html b.修改模板文件目录层次 Tpl/Index/index.ht

flask渲染模板时报错TypeError: &#39;UnboundField&#39; object is not callable

渲染模板时,访问页面提示TypeError: 'UnboundField' object is not callable 检查代码,发现实例化表单类是,没有加括号:form = NewNoteForm,加了括号后就解决了form = NewNoteForm() @app.route('/index')def index(): form = NewNoteForm notes = Note.query.all() return render_template('index.html', notes

Flask 的模板渲染

Flask 的模板渲染 from flask import Flask,render_template,Markup app = Flask(__name__) app.debug = True USERS = { 1:{'name':'张三','age':18,'gender':'男','text':"道路千万条"}, 2:{'name':'李四','age':28,'gender':'男','text':"安全第一条"}, 3:{'name':'王五','age

flask的模板

flask用的是jinja2的模板 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体的值需要从使用的数据中获取 使用真实值替换变量,再返回最终得到的字符串,这个过程称为"渲染" Flask是使用 Jinja2 这个模板引擎来渲染模板 使用模板的好处: 视图函数只负责业务逻辑和数据处理(业务逻辑方面) 而模板则取到视图函数的数据结果进行展示(视图展示方面) 代码结构清晰,耦合度低 Jinja2 两个概念: Jinja2:是 Python 下一个被广泛

SpringBoot2 整合 JSP视图模板 整合 Ueditor富文本编辑器

一般涉及到后台管理系统,就少不了富文本编辑器,这个可以图文视频混排高级工具,笔者通过对比,发现目前市场上最好的三方库还当属百度的 ueditor 近年来 SpringBoot 框架可谓越来越火,可是笔者发现 ueditor 只提供了对于 JSP 的版本,网上能找到很多继承的案列,但是大部分都是修改源码,或者 自己去实现上传文件的接口这使得一些功能不能被使用或者需要花大量的事件去实现上传文件的方法,通过权衡,还是 springboot + jsp + ueditor 的方式最简单 虽然 jsp 不

记录flask使用模板时出现的“Internal Server Error”错误

在看<Flask Web开发实战:入门.进阶与原理解析(李辉著 )>时照着书上的代码抄了一遍,然后运行时发现一直出现以下的错误 书上的源代码如下 watchlist.html <head> <meta charset="utf-8"> <title>{{ user.username }}'s Watchlist</title> </head> <body> <a href="{{ url

11.1 Flask 框架介绍

FLASK 框架 框架介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架, 对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理, 即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器. “微”(micro) 并不表示你需要把整

11.7 Flask flask-sqlalchemy组件

概念 把Flask和SQLAlchemy结合在一起,粘合剂 更加方便了,不再需要自己手动写链接池了 但是基础操作还是和SQLAlchemy 一样 使用方式 下载安装 pip3 install flask-sqlalchemy 链接数据库 格式 pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] 配置文件中添加 SQLALCHEMY_DATABASE_U

视图 模板渲染 过滤器(内置) 标签

今日内容 视图 视图加装饰器 模板渲染 过滤器(内置) 标签 视图 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面.除此之外没有更多的要求了 FBV和CBV 视图 FBV(函数类) FBV(function base views) 就是在视图里使用函数处理请求