重定向redirect
最近阅读了Flask的源码,弄懂了原理之后就想尝试来实现自己的一个Web框架。
因为大部分的实现思路都参照Flask0.1版本,也就是最初版本的思路。所用的基本库是werkzeug。
框架的完整代码都放在了Github上,之后会继续更新:https://github.com/jyz0309/WebFrame
求star,球球了T_T
完成了session功能后,接下来来继续完善框架, 这一次要完成的功能是重定向的功能,也就是redirect()
函数。
要完成这一点,首先要明白的是Flask中的实现是怎么样的,结果我发现Flask中是直接调用底层库werkzeug
中的redirect
函数作为外部接口的- -。既然底层库中有直接接口,那为什么还要造多余的轮子呢?
from app import App,View,session
import json
from app import *
class Index(View):
def GET(self,request,x):
# session['hello'] = 2
# return redirect(url_for())
return 'helloer'
def POST(self,request):
print(json.dumps(request.form['color']))
return json.dumps({
'1':'hello'})
class Test(View):
def GET(self,request):
# print(session['hello1'])
print(redirect('/R'))
return redirect('/R')
def POST(self,request):
return json.dumps({
'2':'hello'})
class R(View):
def GET(self,request):
return 'R'
urls = {
'/<x>':Index,
'/test':Test,
'/R':R}
app = App()
app.secret_key = 'password'
app.add_url_rule(urls)
app.run()
这是我一开始的结果,其实也就是直接使用了redirect
函数直接进行处理。
但是启动服务器后,这样会报错,Response对象不是可迭代对象
的错误,在找了很久之后才发现问题所在…
首先来看一下函数的源码:
def redirect(location, code=302, Response=None):
if Response is None:
from .wrappers import Response
display_location = escape(location)
if isinstance(location, text_type):
# Safe conversion is necessary here as we might redirect
# to a broken URI scheme (for instance itms-services).
from .