首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我已经构建了一个flask应用程序,但post请求不起作用

我已经构建了一个flask应用程序,但post请求不起作用
EN

Stack Overflow用户
提问于 2020-07-02 09:07:33
回答 2查看 562关注 0票数 0

我已经使用flask和sqlalchemy设置了一个数据库和一个应用程序,get请求工作正常,但post请求根本不工作,请在这里支持我,如果你可以,下面你会有代码,这只是我的项目的一小部分,get请求工作良好,但post否。

数据库设置

代码语言:javascript
运行
复制
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy import create_engine
from passlib.apps import custom_app_context as pwd_context
import random, string
from itsdangerous import(TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired)

Base = declarative_base()


class Relation(Base):
    __tablename__ = 'relation'

    id = Column(Integer, primary_key=True)
    base_user_first = Column(String(250), nullable=False)
    base_user_second = Column(String(250), nullable=False)
    relation = Column(String(250), nullable=False)
    reverse_relation = Column(String(250), nullable=False)


    @property
    def serialize(self):
        return {
            'base_user_first': self.base_user_first,
            'id': self.id,
            'base_user_second': self.base_user_second,
            'relation': self.relation,
            'reverse_relation': self.reverse_relation,
          }

    


# creating the DB.
engine = create_engine('sqlite:///myneighbour.db')
Base.metadata.create_all(engine)

应用程序代码

代码语言:javascript
运行
复制
from database_setup import Base, Relation
from flask import Flask, jsonify, request, url_for, abort, g
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy import create_engine

from flask_httpauth import HTTPBasicAuth

from flask import session as login_session
import random
import string
from oauth2client.client import flow_from_clientsecrets
from oauth2client.client import FlowExchangeError
import httplib2
import json
from flask import make_response
import requests


auth = HTTPBasicAuth()


engine = create_engine('sqlite:///myneighbour.db')

Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
app = Flask(__name__)






@app.route('/relation/<int:relation_id>/JSON')
def relationJSON(relation_id):
    relation = session.query(Relation).filter_by(id=relation_id).one()
    items = session.query(Relation).filter_by(
        relation_id=relation_id).all()

    return jsonify(Relation=[i.serialize for i in items])



# view all the relations
@app.route('/relation/JSON')
def relationsJSON():
    relations = session.query(Relation).all()
    return jsonify(relations=[r.serialize for r in relations])



# Create a new Relation


@app.route('/relation/new/', methods=['GET', 'POST'])
def newRelation():
    # if 'username' not in login_session:
    #     return 405
    if request.method == 'POST':
        newRelation = Relation(
            base_user_first=request.form['base_user_first'],
            base_user_second=request.form['base_user_second'],
            relation=request.form['relation'],
            reverse_relation=request.form['reverse_relation'])
        session.add(newRelation)
        #flash('New Facility %s Successfully Created' % newFacility.name)
        session.commit()
        return jsonify (newRelation)

# Edit a Relation


@app.route('/relation/<int:relation_id>/edit/', methods=['GET', 'POST'])
def editRelation(relation_id):
    editedRelation = session.query(
        Relation).filter_by(id=relation_id).one()
    # if 'username' not in login_session:
    #     return 405
    # if editedFacility.user_id != login_session['user_id']:
    #     return "<script>function myFunction() {alert('You are not authorized \
    #     to edit this restaurant. Please create your own restaurant in order to\
    #     edit.');}</script><body onload='myFunction()'>"
    if request.method == 'POST':
        if request.form['base_user_first']:
            editedRelation.base_user_first = request.form['base_user_first']

        if request.form['base_user_second']:
            editedRelation.base_user_second = request.form['base_user_second']

        if request.form['relation']:
            editedRelation.relation = request.form['relation']

        if request.form['reverse_relation']:
            editedRelation.reverse_relation = request.form['reverse_relation']



            #flash('Restaurant Successfully Edited %s' % editedRestaurant.name)
            return jsonify(editedRelation)
    # else:
    #     return render_template(
    #         'editRestaurant.html', restaurant=editedRestaurant
    #         )


# Delete a relation
@app.route('/relation/<int:relation_id>/delete/', methods=['GET', 'POST'])
def deleteRelation(relation_id):
    relationToDelete = session.query(
        Relation).filter_by(id=relation_id).one()
    # if 'username' not in login_session:
    #     return 405
    # if facilityToDelete.user_id != login_session['user_id']:
    #     return "<script>function myFunction() {alert('You are not authorized \
    #     to delete this restaurant. Please create your own restaurant in order \
    #     to delete.');}</script><body onload='myFunction()'>"
    if request.method == 'POST':
        session.delete(relationToDelete)
        #flash('%s Successfully Deleted' % restaurantToDelete.name)
        session.commit()
        return ("the relation has been deleted")

if __name__ == '__main__':
    app.debug = True
    #app.config['SECRET_KEY'] = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(32))
    app.run(host="0.0.0.0", port=5000, debug=True)

下面是我使用/relation.new端点通过postman发出post请求时收到的信息

代码语言:javascript
运行
复制
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>
EN

回答 2

Stack Overflow用户

发布于 2020-07-02 12:05:45

将所有出现的request.form['base_user_first']等替换为request.form.get('base_user_first')

Form sending error, Flask

票数 0
EN

Stack Overflow用户

发布于 2020-07-02 13:22:04

您收到来自服务器的Bad Request错误。这意味着您的前端(HTML表单)没有向服务器发送预期的参数。例如,如果您的服务器希望通过post从客户端获得字段数据,如下所示:

代码语言:javascript
运行
复制
@app.route('/user', methods=["GET", "POST"])
def userdata():
    name = request.form['name']
    email = request.form['email']
    ....

你的前端会发送类似这样的东西:

代码语言:javascript
运行
复制
fetch('/users', {
  method: 'POST',
  body: {
     nam: "Typo in name",
     email: "email@somethig.com"
  },
})

服务器需要name,但是前端代码发送了**nam**,这将生成Bad Request(400)错误。底线是,确保来自前端的所有请求数据都与服务器期望的数据相匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62687466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档