Flask视图函数与模板语法
1.Django中的CBV模式
2.Flask中的CBV和FBV
def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner
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即FBV中的endpoint,指别名
if __name__ == '__main__':
app.run()
类视图及其使用
视图函数不能面向对象编程,利用类视图来代替视图函数来解决这个问题
导入视图类 View
from flask.views import View
编写一个视图子类
class MyView(View): # MyView继承于View
def test(self): # 自定义的方法
return '测试类视图'
def dispatch_request(self): # 必须重写这个方法
resp = self.test()
return resp
利用View子类获取到一个视图方法
MyView.as_view('test')
注意:.as_view方法的放回值是一个方法,而且该方法的名字就是传进去的参数
将获取到的视图方法和路径对应起来
app.add_url_rule('/test/', view_func=MyView.as_view('test')) # MyView.as_view('test') 返回的是一个方法
类视图的原理
把as_view方法返回的结果赋值给view_func
as_view方法返回的是一个方法(注意:as_view方法传入的参数就是as_view返回的那个方法的名字),该方法会调用dispatch_request方法
一旦路由进来,就会调用 dispatch_request 方法
类视图的目的就是实现逻辑分离、方便管理
from flask import Flask
from flask.views import View
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World'
class MyView(View): # MyView继承于View
def test(self): # 自定义的方法
return '测试类视图'
def dispatch_request(self): # 必须重写这个方法
resp = self.test()
return resp
app.add_url_rule('/test/', view_func=MyView.as_view('test')) # MyView.as_view('test') 返回的是一个方法
print(app.url_map)
if __name__ == '__main__':
app.run(debug=True)
# 把as_view方法返回的结果赋值给view_func
# as_view方法返回的是一个方法(注意:as_view方法传入的参数就是as_view返回的那个方法的名字),该方法会调用dispatch_request方法
# 一旦路由进来,就会调用 dispatch_request 方法
# 类视图的目的就是实现逻辑分离、方便管理
方法视图及其使用
利用视图函数实现不同的请求执行不同的逻辑时比较复杂,需要在视图函数函数中进行判断;如果利用方法视图实现就比较简单
@app.route('/test/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
# 做GET的事情
pass
elif request.method == 'POST':
# 做POST的事情
pass
return '测试'
导入方法视图类
from flask.views import MethodView
创建方法视图子类
class TestMethodView(MethodView):
def get(self):
# 处理Get请求
return 'GET请求'
def post(self):
# 处理post请求
return 'POST请求'
注意:视图类中的方法就是支持的请求类型
利用方法视图子类创建一个视图函数
TestMethodView.as_view('testMethodView')
注意:as_view返回的是一个视图函数,而且该视图函数逇名称就是传进去的参数
将获取到的视图方法和路径对应起来
app.add_url_rule('/test02/', view_func=TestMethodView.as_view('testMethodView'))
from flask import Flask
from flask import request
from flask.views import MethodView
app = Flask(__name__)
@app.route('/')
def index():
return '测试主页面'
@app.route('/test/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
# 做GET的事情
pass
elif request.method == 'POST':
# 做POST的事情
pass
return '测试'
class TestMethodView(MethodView):
def get(self):
# 处理Get请求
return 'GET请求'
def post(self):
# 处理post请求
return 'POST请求'
app.add_url_rule('/test02/', view_func=TestMethodView.as_view('testMethodView'))
# method = TestMethodView.as_view('testMethodView');
# app.add_url_rule('/test02/<name>/', view_func=method, methods=['GET'])
print(app.url_map)
if __name__ == '__main__':
app.run(debug=True)
虽然在方法视图中定义的函数就是支持的请求类型,但是我们可以在配置路径时指定哪个路径对应哪中类型的请求
利用方法视图子类获取一个名字为testMethodView02的视图函数,该视图函数只能支持GET请求,而且支持转换器
method02 = TestMethodView.as_view('testMethodView02');
app.add_url_rule('/test02/<name>/', view_func=method02, methods=['GET'])
利用利用方法视图子类获取一个名字为testMethodView03的视图函数,该视图函数只能支持POST请求
method03 = TestMethodView.as_view('testMethodView03')
app.add_url_rule('/test03/', view_func=method03, methods=['POST'])
模拟POST请求
from flask import Flask
from flask import request
from flask.views import MethodView
app = Flask(__name__)
@app.route('/')
def index():
return '测试主页面'
@app.route('/test/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
# 做GET的事情
pass
elif request.method == 'POST':
# 做POST的事情
pass
return '测试'
class TestMethodView(MethodView):
def get(self, name):
# 处理Get请求, 也可以在这些方法中调用其他的方法
return 'GET请求' + name
def post(self):
# 处理post请求, 也可以在这些方法中调用其他的方法
return 'POST请求'
# app.add_url_rule('/test02/', view_func=TestMethodView.as_view('testMethodView'))
method02 = TestMethodView.as_view('testMethodView02');
app.add_url_rule('/test02/<name>/', view_func=method02, methods=['GET'])
method03 = TestMethodView.as_view('testMethodView03')
app.add_url_rule('/test03/', view_func=method03, methods=['POST'])
print(app.url_map)
if __name__ == '__main__':
app.run(debug=True)
六、请求与响应
from flask import Flask
from flask import request
from flask import render_template
from flask import redirect
from flask import make_response
app = Flask(__name__)
@app.route('/login.html', methods=['GET', "POST"])
def login():
# 请求相关信息
# 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))
# 响应相关信息
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')
# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response
return "内容"
if __name__ == '__main__':
app.run()
#######################################################################################
from flask import Flask,url_for,request,redirect,render_template,jsonify,make_response
from urllib.parse import urlencode,quote,unquote
app = Flask(__name__)
@app.route('/index',endpoint='xx')
def index():
from werkzeug.datastructures import ImmutableMultiDict
=================
# get_data = request.args
# get_dict = get_data.to_dict()
# get_dict['xx'] = '18'
# url = urlencode(get_dict)
# print(url)
====================
# print(request.query_string)
# print(request.args)
==========================
# val = "%E6%8A%8A%E5%87%A0%E4%B8%AA"
# print(unquote(val)) #把上面这样的数据转换成中文
#
# return "Index"
# return "Index"
# return redirect()
# return render_template()
# return jsonify(name='alex',age='18') #相当于JsonResponse
=======================
response = make_response('xxxxx') ##如果是返回更多的值,cookie,headers,或者其他的就可用它
response.headers['xxx'] = '123123'
return response
if __name__ == '__main__':
# app.__call__
app.run()
七、模板语法
1、模板的使用
Flask使用的是Jinja2模板,所以其语法和Django无太大差别
Flask中模板里面,执行函数时,需要带()才执行
1.为了防止xss攻击,加了验证,所以页面上显示字符串的形式,解决办法,有两种方法
方法一:在后端使用Markup,等价于Django里的mark_safe
v = Markup("<input type='text' />")
方法二:在前端使用safe
{{ v1|safe }}
2.静态文件的两种导入方式
目录结构:
方式一:
方式二:
3.flask中模板语法不提示,解决办法
点击选择jinja2
2、自定义模板方法
Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render_template,
run.py
from flask import Flask,url_for,render_template,Markup
app = Flask(__name__)
def test(a,b): #自定义的标签,此方法在使用时,需要在render_temlate中传入到指定以页面使用
return a+b
@app.template_global() # 不需要传入,可直接在页面使用
def sb(a1, a2):
return a1 + a2 + 100
@app.template_filter() #不需要传入,使用时要在一个值(此值作为第一个参数传入到过滤器中)的后面加入|,然后再加参数
def db(a1, a2, a3):
return a1 + a2 + a3
@app.route('/index')
def index():
v1 = "字符串"
v2 = [11,22,33]
v3 = {"k1":"v3","sdf":"sdgfgf"}
v4 = "<input type='text' />"
v5 = Markup("<input type='text' />")
return render_template("index.html",v1=v1,v2=v2,v3=v3,v4=v4,v5=v5,test=test)
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width">
<title>Title</title>
</head>
<body>
{{ v1 }}
<ul>
{% for foo in v2 %}
<li>{{ foo }}</li>
{% endfor %}
{{ v2.1 }}
{% for k,v in v3.items() %}
<li>{{ k }} {{ v }}</li>
{% endfor %}
{{ v3.k1 }}
{{ v3.get("k1") }}
{{ v4|safe }}
{{ v5 }}
<h1>{{ test(1,2) }}</h1>
<p>{{ sb(1,2) }}</p>
<p>{{ 1| db(2,3) }}</p>
</ul>
</body>
</html>
PS:模板继承的方法和django的一样。
3.宏
只有定义的东西在很多地方去使用的时候才去用它,
html
{% macro xx(name, type='text', value='') %}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
{{ xx('n1') }}
相当于在页面上定义了一个名为xx的'函数',这个函数接收3个参数,我们给type和value写上了默认值,此时调用,我们还需要传入一个参数,我们此时传入了一个n1,则
页面上会生成3个input框,name都为n1
原文链接:
https://www.cnblogs.com/huchong/p/8227606.html
识别图中二维码,领取python全套视频资料
Flask视图函数与模板语法的更多相关文章
- Flask视图函数报fmalformed url rule错误的原因
Flask视图函数报fmalformed url rule错误,原因可能是包含中文字符了 把标点符号都重新写一遍英文格式的,可能就不会报这个了
- django重点url,视图函数,模板语言
django重点url,视图函数,模板语言url 1.django重点url无命名分组:re_path() 2.url第一个参:url未命别名分组就不需要views中参数一定,若命别名(?P<y ...
- flask 视图函数的使用
flask框架 视图函数当中 各种实用情况简单配置 1 建立连接 2 路由参数 3 返回网络状态码 4 自定义错误页面 5 重定向 6 正则url限制 和 url 优化 7 设置和获取cookie # ...
- Flask视图函数与普通函数的区别,响应对象Response
视图函数与普通函数看似没什么区别,其实他们的返回值上有着很大的区别. from flask import Flask app = Flask(__name__) @app.route('/hello' ...
- 关于:url、视图函数、模板3者之间参数传递的理解
url获取参数的途径有2个: 1.url中的变量,设置在URL地址中. 2.url中添加字典,设置在URL地址外. urlpatterns = [ path('<year>/<int ...
- django视图函数解析(三)
1 视图views概述 1 作用: 视图接受web请求并响应web请求 2 本质: 视图就是python中的处理函数 3 响应: 一般是一个网页的HTML内容.一个重定向.错误信息页面.json格式的 ...
- Flask初学者:视图函数/方法返回值(HTML模板/Response对象)
返回HTML模板:使用“from flask import render_template”,在函数中传入相对于文件夹“templates”HTML模板路径名称字符串即可(默认模板路径),flask会 ...
- Flask之勾子,错误捕获以及模板语法
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...
- flask模板的基本用法(定界符、模板语法、渲染模板),模板辅助工具(上下文、全局对象、过滤器、测试器、模板环境对象)
flask模板 在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成. 当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的当时在HTM ...
随机推荐
- 一题关于PHP的CTF
if(isset($_GET['time'])){ if(!is_numeric($_GET['time'])){ echo 'The time must be number.'; }else if( ...
- Hbase脚本小结
脚本使用小结: 1.开启集群,start-hbase.sh 2.关闭集群,stop-hbase.sh 3.开启/关闭所有的regionserver.zookeeper,hbase-daemons.sh ...
- C语言 · 复数四则运算
算法提高 6-17复数四则运算 时间限制:1.0s 内存限制:512.0MB 设计复数库,实现基本的复数加减乘除运算. 输入时只需分别键入实部和虚部,以空格分割,两个复数之间用运算符 ...
- 009Maven_建立私服——报错问题
前一篇文章的建立私服一直出问题,这里的问题是: jdk6.0只支持nuxus2.5及以下的版本,要支持nexus2.6以上,必须要jdk7.0以上.不然报错,把nexus-2.6.2war包放在Tom ...
- PHP字符串截取操作大全
1. 截取GB2312中文字符串 <?php header("content-type:text/html;charset=gb2312"); // echo "a ...
- 滚动到指定位置js
function mScroll(id){ $("html,body").stop(true); $(); }
- 终端利用ssh登录远程服务器
第一步: 安装ssh:yum install ssh 第二步: 启动ssh服务:service sshd start 第三步: 连接远程服务器: ssh -p 端口号 用户名@ip地址 然 ...
- DML语句报错是因为控制文件无法扩大还是另有原因?
今天处理了一个很有意思的故障问题,来龙去脉是这种: 客户来电咨询控制文件无法扩展,数据库仅仅能查询但不支持DML,须要远程支持.接到电话的第一反应就是CONTROL_FILE_RECORD_KEEP_ ...
- HttpModule,HttpContext,HttpHandler
http://www.cnblogs.com/wujy/tag/ASP.NET%E5%9F%BA%E7%A1%80/ http://www.th7.cn/Program/net/2011/12/26/ ...
- windows mysql初始化
参考文章 https://dev.mysql.com/doc/refman/5.7/en/windows-install-archive.html mysqld --initialize --user ...