当前位置:Gxlcms > Python > Flask框架返回GET请求的参数为什么会导致500InternalServerError?

Flask框架返回GET请求的参数为什么会导致500InternalServerError?

时间:2021-07-01 10:21:17 帮助过:93人阅读

回复内容:

首先明确这几个Python的规则,然后再做推断。

1. data是传入的查询参数,按照现代各类编程语言的玩法,是要先转换成unicode字符串的,这样做国际化和本地化才比较方便。所以data的类型就是unicode,type(data)返回的结果就是unicode。这个unicode是Python的内置类型,同时也是一个函数。

2. type(data)==unicode之后,在Python的控制台直接打印,会获得 "" 这是因为Python控制台在打印时会自动调用对象的 .__str__() 方法,来获得一个可以显示的字符串,这也是Python的方便之处。你可以手工在Python控制台里执行 str(unicode) 会得到 "" 。

3. Web框架是如何工作的?常用的PythonWeb框架在请求处理函数所需的返回值类型是str,这样就可以直接发送给客户端了。如果需要定制响应头,可以用框架内置的Response对象。但无论如何,这些框架的底层基本都是直接实现WSGI接口,一个Python通用的Web服务器接口。而如上的start_response() 其实就是Flask在检测到函数返回值为一个函数时,就把他当成了一个WSGI函数来处理。传入了WSGI函数的两个参数,一个dict类型的环境,一个function类型start_response函数。即实际调用的是unicode(environ,start_response)。

4. unicode函数的用法是将一个字符串转换成unicode对象。第一个参数是字符串,第二个参数是编码字符集。比如
>>> print(unicode('你好','utf-8'))
你好

所以,你的程序所遇到的问题是这样的。data是个unicode类型,也是unicode函数。Flask里作为返回值时,Flask检测到这是个函数,于是当成了一个WSGI application来处理,传入了environ和start_response两个参数。而unicode函数实际接受的两个参数是字符串和字符集,所以遇到了参数错误。

你如果需要在Flask知道data的类型,可以用 str(type(data)) 。这样将输出转换成可显示的字符串,就能看到了。 在 Flask 中,根据 method handle 返回的结果,首先调用 make_response

def make_response(self, rv):
    ...
    if not isinstance(rv, self.response_class):
        if isinstance(rv, (text_type, bytes, bytearray)): 
            rv = self.response_class(rv, headers=headers, status=status)
            headers = status = None
        # rv是 method handle返回的结果,在k神代码中是 
        else: 
            rv = self.response_class.force_type(rv, request.environ)
因为type(data)返回的是一个type类型,而函数不允许return一个type类型。改成这样:
return repr(type(data)) 可能是机制不一样,flask的视图返回字符串之类,就算你返回数字也是不行的,最近我也是在弄微信web那块,刚折腾的差不多,而且你那个公众号好像是个人未认证订阅号吧,开发者模式没有自定义菜单的,也就是缺少一个直接的web入口,还得通过消息发链接,挺麻烦的,限制很多,另外去stackoverflow搜索会更好点,基本都能找到答案 app.debug=True
可以看到详细错误 按规定这个要返回字符串,那你就要返回字符串,返回别的能用不说明任何问题,也不代表以后的版本仍然能用,当你返回不是字符串的时候就已经是未定义行为了,只是在web.py里面这个未定义行为刚好是可以用的而已 你可以打开debug模式。 来自 webpy 源码 webpy/utils.py
def safestr(obj, encoding='utf-8'):
    r"""
    Converts any given object to utf-8 encoded string. 
    
        >>> safestr('hello')
        'hello'
        >>> safestr(u'\u1234')
        '\xe1\x88\xb4'
        >>> safestr(2)
        '2'
    """
    if isinstance(obj, unicode):
        return obj.encode(encoding)
    elif isinstance(obj, str):
        return obj
    elif hasattr(obj, 'next'): # iterator
        return itertools.imap(safestr, obj)
    else:
        return str(obj)
我写的flask应用中,methods是写在app.route装饰器里面的。
类似这样
@app.route('/', methods=['GET', 'POST'])
def func(args):


要不这么改改试试?

人气教程排行