欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-30 19:09:47
...

回复内容:

首先明确这几个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入口,还得通过消息发链接,挺麻烦的,限制很多,另外去*搜索会更好点,基本都能找到答案 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):


要不这么改改试试?Flask框架返回GET请求的参数为什么会导致500 Internal Server Error?

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • Flask框架返回GET请求的参数为什么会导致500 Internal Server Error?
  • 专题推荐