前后分离且跨域的Flask项目 中 POST application/x-www-form-urlencoded 数据的怎么获取

Flask 框架,项目是前后分离。 请求为fetch,后端post拿不到数据;
具体症状:

1. get可以获取,post请求发出后请求被挂起,页面没有响应;
2. 只要后端代码出现request.form就会出现被挂起
3. 搜索网上和segmentfault的写法,均无效;
4. 请求是
        POST
        Formdata
            username: 'aaa'
            password: '11221212' 
            
               

后端代码

@app.route('/blog/login', methods=['post'])
def login():
        try:
                print(334,request.method, request.form.get('username'))
        except:
                print(11111)
        return '123'

错误信息

Traceback (most recent call last):
  File "/Users/zhongwangsheng/Developer/PyProject/family/venv/lib/python2.7/site-packages/werkzeug/serving.py", line 270, in run_wsgi
    execute(self.server.app)
  File "/Users/zhongwangsheng/Developer/PyProject/family/venv/lib/python2.7/site-packages/werkzeug/serving.py", line 261, in execute
    write(data)
  File "/Users/zhongwangsheng/Developer/PyProject/family/venv/lib/python2.7/site-packages/werkzeug/serving.py", line 236, in write
    self.send_header('Server', self.version_string())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 401, in send_header
    self.wfile.write("%s: %s\r\n" % (keyword, value))
IOError: [Errno 32] Broken pipe

以下为修改后的登录代码,还是一样的错误“请求被挂起,没反应,约1分钟后失败error”

@app.route('/blog/login', methods=['post'])
def login():
        try:
                print(111, request.data)
                print(222, request.form)
        except:
                print(333)
        return 1234

以下是用fetch发送的请求信息

Request URL:http://localhost:8084/blog/login
Referrer Policy:no-referrer-when-downgrade
Provisional headers are shown
Authorization:
Content-Type:application/x-www-form-urlencoded
Origin:http://localhost:8084
Referer:http://localhost:8084/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36 OPR/51.0.2830.55 (Edition Baidu)

Form Data
    password:123456
    username:zws
阅读 6.2k
3 个回答

测试正常

>>> requests.post('http://127.0.0.1:5000/blog/login', data={'username':'hello'})
<Response [200]>
 * Running on http://127.0.0.1:5000/
(334, 'POST', u'hello')

如果其它地方正常,估计你没有写这个

from flask import request

应该不会是跨域问题的,假如跨域了,是到不了你的逻辑代码的。
现在的信息判断不出为什么,但是你可以尝试把request.form替换成request.data试下

建议一步步进行排查
先在login方法什么都不要写,直接return一个值,验证一下你说的“只要后端代码出现request.form就会出现被挂起”

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题