文章目录
- 一、Flask的CBV
- 1.CBV的写法
- 2.as_view的执行流程
- 3.Login.as_view(name=‘index’) name到底有什么用?
- 4.CBV中得methods作用
- 二、模版语法
- 1.渲染变量
- 2.变量的循环
- 3.逻辑判断
- 三、请求和响应
一、Flask的CBV
1.CBV的写法
from flask import Flask
app = Flask(__name__)
app.debug = True# FBV的写法
@app.route('/')
def index():return 'hello'# CBV的写法
from flask.views import MethodView
class TestView(MethodView):def get(self):return '我是get'def post(self):return '我是post'# 注册路由
# as_view必须加一个字符串---》是路由的别名
# endpoint 和 as_view(name= 路由别名),以谁为准?
# 读源码后,知道了,以 endpoint 为准
# 如果endpoint 没传--》endpoint是 view_func.__name__ 视图函数的名字 ,别名就是函数名
# 如果endpoint 没传,as_view(name= 路由别名)也没传---》去视图函数名字-->视图函数都是:view
# as_view(name= 路由别名) 有什么用? 把view的名字改为了,你传入的字符串名
app.add_url_rule('/test', 'test', TestView.as_view('test'))if __name__ == '__main__':app.run()
2.as_view的执行流程
把源码精简一下def as_view(cls, name, *class_args, **class_kwargs):def view(**kwargs):return self.dispatch_request(**kwargs)return viewdef dispatch_request(self, **kwargs):meth = getattr(self, request.method.lower(), None)return meth(**kwargs) 请求来了,路由匹配成功,会执行as_view内的view() 也执行了类中的self.dispatch_request....这个就跟我们Django中的CBV一样了然后看到self.dispatch_request中方法 ,在当前视图类中反射,请求方式的小写字符串(get,post),如果我们写了这些方法 就会去执行。
3.Login.as_view(name=‘index’) name到底有什么用?
先研究endpoint有什么用,正常的fbv,如果不写endpoint会以函数名作为别名endpoint如何设置的?如果endpoint为None,它把函数名作为了endpointif endpoint is None:endpoint = _endpoint_from_view_func(view_func) # view_func.__name__options["endpoint"] = endpoint # 如果都是endpoint就会冲突Login.as_view(name='index'),name到底有啥用app.add_url_rule('/login', view_func=Login.as_view('login'))没有传endpoint,Login.as_view('login')是view函数的内存地址endpoint会以函数名作为endpoint的值,现在所有函数都是view,必须传入name,来修改调view函数的名字如果传了endpoint,别名以endpoint为主,如果不传endpoint,别名以name为主app.add_url_rule('/login', view_func=Login.as_view(name='login'),endpoint='xxx')
4.CBV中得methods作用
视图类中有个属性就是methods = ['GET', 'POST']用来控制允许的请求方式 写了什么方法 就允许什么请求 若没有写则不能使用该方法
二、模版语法
1.渲染变量
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>用户列表</h1><table>{% for k,v in user_dict.items() %}<tr><td>{{k}}</td><td>{{v.name}}</td><td>{{v['name']}}</td><td>{{v.get('name')}}</td><td><a href="/detail/{{k}}">查看详细</a></td></tr>{% endfor %}</table>
</body>
</html>
2.变量的循环
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>用户列表</h1><table>{% for k,v in user_dict.items() %}<tr><td>{{k}}</td><td>{{v.name}}</td><td>{{v['name']}}</td><td>{{v.get('name')}}</td><td><a href="/detail/{{k}}">查看详细</a></td></tr>{% endfor %}</table>
</body>
</html>
3.逻辑判断
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>用户列表</h1><table>{% if name %}<h1>Hello {{ name }}!</h1>{% else %}<h1>Hello World!</h1>{% endif %}</table>
</body>
</html>
比django中多可以加括号,执行函数,传参数
from flask import Flask,render_template,jsonify,make_responsefrom markupsafe import Markupapp = Flask(__name__, template_folder='temp')def func1(arg):return Markup("<input type='text' value='%s' />" %(arg,))@app.route('/')def index():return render_template('index.html',ff = func1)if __name__ == '__main__':app.run()index.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>{{ff('六五')}}{{ff('六五')|safe}}</body></html>注意:1.Markup等价django的mark_safe ,2.extends,include一模一样
三、请求和响应
from flask import Flaskfrom flask import requestfrom flask import render_templatefrom flask import redirectfrom flask import make_responseapp = Flask(__name__)@app.route('/login.html', methods=['GET', "POST"])def login():'请求(request,http请求中的东西,都能从request中取出来)'1.请求相关信息# request.method 提交的方法# request.args get请求提及的数据# request.form post请求提交的数据# request.values post和get提交的数据总和# request.cookies 客户端所带的cookie# request.headers 请求头# request.path 不带域名,请求路径# request.full_path 不带域名,带参数的请求路径# request.script_root # request.url 带域名带参数的请求路径# request.base_url 带域名请求路径# request.url_root 域名# request.host_url 域名# request.host 127.0.0.1:500# request.files# obj = request.files['the_file_name']# obj.save('/var/www/uploads/' + secure_filename(f.filename))'响应'2.响应相关信息# return "字符串"# return render_template('html模板路径',**{})# return redirect('/index.html')#return jsonify({'k1':'v1'})# 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'# 向响应头中添加res = make_response('hello')res.headers['xx'] = 'll'# return responseretrun resreturn "内容"if __name__ == '__main__':app.run()