前言今天给大家介绍一个轻量级的Pythonweb开发框架------Flask。你为什么推荐它?当然是因为它足够轻量,而且它的特点是开发速度快。当然它也有缺点,这里就不说了,因为用起来感觉不好说不好。上一篇我们讲了一半的内容,盘点了PythonWeb开发轻量级框架Flask的知识(上)。本文继续完成剩下的一半内容。一起来学习吧~11.request操作是一个专门用来操作网页请求的A模块,今天我们就围绕这个来详细讲解一下。1)request.method是request.method中的请求方法。一般我们用get和post比较多。由于get和post需要和form一起使用,这里暂时不说前端的内容,只做简单的demo。1、get请求可以通过设置其methods参数来指定请求方法。@app.route('/get',methods=['GET','POST'])defget():ifrequest.method=='GET':return'这是一个GET请求'else:return'这是一个其他请求'2.post请求@app.route('/post',methods=['POST','GET'])defpost():ifrequest.method=='POST':return'这是一个POST请求'else:return'Thisisanotherrequest'2)request.args记录get请求中的查询参数,一般用于查询,搜索URLhttps://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=别说了会返回get请求中的参数,比如请求上面的url,它的请求参数是:searchType=song&searchKeyWord=别说了使用方法:request.args['keyword']request.args.get('keyword')3)request.form记录了请求中的表单数据,一般用于表单提交。比如我们在注册一个网站的时候,往往需要提交一个表单。我们可以使用来获取表单中的内容:request.form['keyword']request.form.get('keyword')4)reuqest.values返回请求中的参数和表单,很少用到,所以我现在不会详细介绍。5)request.cookies获取网页中cookies的所有信息,或者只获取cookies中某个参数的值。request.cookies['keyword']request.cookies.get('keyword')6)request.headers返回请求网页的头部信息,返回一个列表。request.headers['keyword']request.headers.get('keyword')7)request.url,path,script_root,base_url,url_rootrequest.url:返回请求中的网页地址request.path:返回web页面存储地址请求。script_root:返回脚本根目录request.base_url:返回请求相对地址request.url_root:返回请求网页根目录8)request.data返回请求的数据request.data#返回一个字节类型的值9)request.files文件上传必填,属于提交表单的类型,所以这是一个post类型的请求方法,我们可以使用files的file字段来设置:@app.route('/upload',methods=['GET','POST'])defupload():ifrequest.method=='POST':f=request.files['file']filename=secure_filename(f.filename)#需要设置安全文件类型#f.save(os.path.join('app/static',filename))两种保存方式f.save('app/static/'+str(filename))return'ok'else:return'fail'10)request.json返回json格式的数据11)request.environ返回环境变量的key值12)request.remote_addr返回客户端的访问ip地址13)request.host返回host信息12.context和requesthook1)context可能对大多数人来说比较难要搞清楚这个概念,我先说说context,什么是context?说到context,估计大家第一时间会想到with。想到with,肯定会想到context模块contexlib和魔术方法enter和exit。可以说是化繁为简。作为神器的装饰器,我是这样理解的。然后看flask的上下文。1.应用上下文作用于flask应用,可以作为程序实例,存放临时变量。它可以分为两种类型:g:在处理请求时用作临时存储的对象。这个变量current_app每次请求都会被重置:当前程序实例2.请求上下文顾名思义,就是用在网络请求中,有两种。request:请求对象Session:storesession2)Hook我们再来看看hook。什么是钩子?这是我们首先要搞清楚的。一个hook其实就是我们在发出请求的时候,规范了我们的请求内容和请求方法以及请求的时候做什么,什么时候做,具体做什么,起到承前启后的作用,所以非常有用。1.在处理第一个请求之前运行,可用于连接数据库进行查询操作before_first_request2.在处理每个请求之前运行,可进行权限校验before_request3.在每个请求结束后自动处理返回的响应数据after_request4.每次请求结束后自动抛出异常,并将异常对象作为参数传递给函数teardown_request5.在视图函数中注册一个函数,在请求结束后运行after_this_request说了这么多,应该如何用过的?接下来请看我的表现:@app.before_first_requestdefirst():print('我是第一个跑')@app.before_requestdefevery():print('我又来了')@app.after_requestdefrecv(res):res.headers['Content-Type']='application/json'#更改响应头数据returnres@app.route('/start/')defstart(id):g.use=request.cookies.get('user')ifid==g.use:returnrequest.urlelse:returnrequest.cookiesac=app.app_context()#applicationcontextmanagerac.push()#intoprint(ac)a=current_appprint(a)ac。pop()#print(ac)withapp.app_context()asf:b=current_appprint(b)print(f)13.Blueprint从上面的例子我们可以看出,随着我们开发的东西越来越多,把所有东西都放在一个文件里显然是不切实际的。我们尝试使用模块调用,所以写了两个Python程序来调用:demo1.pyfromflaskimportFlaskapp=Flask(__name__)@app.route('/kj')defdf():return'helloworld'@app.route('/index')deflk():return'efhsfj'demo2.pyfromflaskimportFlask,requestfromdemo1import*@app.route('/')deflogin():returnrequest.urlif__name__=='__main__':app.run(debug=True)这里demo2可以成功调用了demo1,但是不能操作demo1的变量和一些实例,也就是说只能调用,不能控制变化,所以这个时候蓝图就派上用场了,一起来看看吧。demo3.pyfromflaskimportFlaskfromdemo4importrootfromdemo5importadminapp=Flask(__name__)#Applicationinstance@app.route('/')deflo():return'1111'app.register_blueprint(root,url_prefix='/')#蓝图对象和蓝图挂载点app。register_blueprint(root,url_prefix='/root')app.register_blueprint(root,url_prefix='/admin')app.register_blueprint(admin,url_prefix='/')app.register_blueprint(admin,url_prefix='/admin')app.register_blueprint(admin,url_prefix='/root')if__name__=='__main__':app.run(debug=True)demo4.pyfromflaskimportFlask,Blueprintroot=Blueprint('root',__name__)#蓝图名称和蓝图所在模块位于@root.route('/login')defb1():return'hello'@root.route('/index')defb2():return'world'demo5.pyfromflaskimportFlask,Blueprintadmin=Blueprint('admin',__name__)#蓝图名称和蓝图所在模块@admin.route('/ff')defbw():return'ergdsfg'@admin.route('/gg')defbe():return'gtergsdf'的蓝图的本质无非是将多个模块引入到一个主模块中使用,相当于自己写模块,作为调用的蓝图。如果多个蓝图中有相同的方法,可以使用蓝图视图功能来区分各自的方法。14.View说到view,相信大家都能想到它的意思。比如mysql数据库中的视图其实是可以互操作的,并没有太大区别,只是功能不同而已。创建视图的方式也很简单,都是继承自flask的views类。1)类视图fromflask.viewsimportViewdefff():return'ok'classst(View):defdispatch_request(self):#这个方法必须要实现return"任性90后男孩"#类视图通过add_url_rule方法映射到urlapp.add_url_rule(rule='/ff',view_func=st.as_view('tt'))2)Methodviewfromflask.viewsimportMethodViewdefgg():return'ok'classlogin(MethodView):#客户端通过get访问时执行method函数defget(self):return'get'#客户端通过post方法访问时执行的函数defpost(self):email=request.form.get("user")password=request.form.get("pass")ifuser=='gffsadff'andpass=='4fsaferwf':return"loginsuccessful"else:return"loginfailed"#通过add_url_rule添加类视图和url映射,并在as_view方法中指定url的名称,方便的url_for函数调用app.add_url_rule('/gg',view_func=login.as_view('lg'))15.补充1)全局对象withapp.test_request_context():print('我是第一个跑')看我ng这个,你应该知道它是做什么用的吧。在整个应用中是最先启动的,可以作为提醒界面什么的。2)路由别名@app.route('/',endpoint='name1')#路由别名是name1deffirst_flask(url):print(url_for('name1',url=url))#如果设置url参数,url_for(别名,加上参数)returnredirect(url_for('get'))#redirect3)添加路由规则deffl():return'ok3'#app.add_url_rule(rule=访问的url,endpoint=路由别名,view_func=viewname,methods=requestmethod)app.add_url_rule(rule='/kj',endpoint='name2',view_func=fl,methods=['GET'])4)其他不使用修饰创建路由的方式central服务器的url映射方法很方便。要实现它,需要创建三个文件:defuse(usename):returnusenameviews.pydefll():return'index'defuse(usename):returnusenamemain.pyfrommyappimportviewsfromflaskimportFlaskapp=Flask(__name__)app.add_url_rule('/',view_func=views.ll)app.add_url_rule('/使用/',view_func=views.use)if__name__=='__main__':app.run(debug=True)5)常见状态码200:请求正确404:路径错误405:请求方法错误500:服务器错误302:redirection301:永久重定向16.小结本文主要介绍Flask最基本的使用方法。Flask是一个非常优秀的web开发框架,可以非常快速的开发web应用。但是需要依赖很多包来完善更多的功能有能力的