gpt4 book ai didi

python - 尝试构建 RESTless API 时出现“方法不允许”错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:51 24 4
gpt4 key购买 nike

我正在学习 Flask,我发现了各种片段,展示了如何使用 SQLAlchemy 定义模型,使用 Flask-reSTLess 定义模型,以及使用 Flask-wtf 表单(我对 REST API 不太熟悉)。更准确地说,我的灵感来自:

但是我无法创建一个完全有效的示例。基于您可以在网上找到的内容,我想创建一个包含 2 个类 PersonComputer 的模型(一个 Person 可以与多个计算机)和用于添加新人员的表单。这是我组装的代码。

布局如下:

test_flask/
├── test_flask.py
├── config.py
└── templates
  └── new_person.html

主文件test_flask.py包含:

from flask import Flask, request, flash, redirect, render_template, url_for
import flask.ext.sqlalchemy
from wtforms.ext.sqlalchemy.orm import model_form
import flask.ext.restless
from flaskext.wtf import Form

# Create the Flask application and the Flask-SQLAlchemy object.
app = Flask(__name__)
app.config.from_object('config')
db = flask.ext.sqlalchemy.SQLAlchemy(app)

# Create the Flask-SQLALchemy models.
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode, unique=True)
birth_date = db.Column(db.Date)


class Computer(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode, unique=True)
vendor = db.Column(db.Unicode)
purchase_time = db.Column(db.DateTime)
owner_id = db.Column(db.Integer, db.ForeignKey('person.id'))
owner = db.relationship('Person', backref=db.backref('computers',
lazy='dynamic'))

# Create the database tables.
db.create_all()

# Create the Flask-Restless API manager.
manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db)

# Create API endpoints.
manager.create_api(Person, methods=['GET', 'POST', 'DELETE'])
manager.create_api(Computer, methods=['GET'])

# Create a form class for class Person.
PersonForm = model_form(Person, base_class=Form)


@app.route('/')
def hello():
return 'Hello World'


@app.route("/api/new_person")
def new_person():
# The new person
person = Person()
# Create a form
form = PersonForm(request.form, person)
if form.validate_on_submit():
form.populate_obj(person)
person.post()
flash("new person %s inserted updated" % person)
return redirect(url_for("new_person"))
return render_template("new_person.html", form=form)

if __name__ == '__main__':
# start the flask loop
app.run()

config.py 文件包含:

DEBUG = True
WTF_CSRF_SECRET_KEY = 'a random string'
SECRET_KEY = 'you-will-never-guess'
WTF_CSRF_ENABLED = True
SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/test.db'

模板new_person.html包含:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="application/json">
<title>New person</title>
</head>
{% block body %}
<form action="new_person" method=post class=add-entry>
<dl>
<dt>Name:
<dd>{{form.name}}
<dt>Birth date:
<dd>{{form.birth_date}}
<dd><input type=submit value=submit>
</dl>
</form>
{% endblock %}
</html>

我可以在 http://127.0.0.1:5000/api/new_person/ 看到添加新人员的表单,但提交时出现“方法不允许”错误。

最佳答案

您正在向 new_person 路由发帖,但尚未配置该路由来接受 POST 请求。默认情况下仅允许 GETHEAD。将 methods 参数设置为 route() 装饰器:

@app.route("/api/new_person", methods=['GET', 'POST'])
def new_person():

请参阅HTTP Methods section Flask 快速入门。

接下来,如果您希望更改持续存在(例如添加新的 Person),则需要提交事务;将新的 person 对象添加到您的 session 中并提交:

db.session.add(person)
db.session.commit()

请参阅Inserting Records section Flask-SQLAlchemy 选择、插入、删除章节。

或者,将 SQLAlchemy session 设置为自动提交所有更改:

db = flask.ext.sqlalchemy.SQLAlchemy(app, session_options={'autocommit': True})

但是,您仍然需要将新对象添加到 session 中。

关于python - 尝试构建 RESTless API 时出现“方法不允许”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com