Flask Restplus не читает переменные URL, как ожидалось - PullRequest
0 голосов
/ 11 июля 2019

Я работаю над CRUD API (используя шаблон фабрики приложений), и мои запросы к URL-адресам с переменными не читаются должным образом, и я не уверен, как это лучше всего понять. Это мой первый проект с Flask-Restful, поэтому я, вероятно, упускаю что-то очевидное.

Минимальный пример выглядит следующим образом:

Factory.py

from flask import Flask
from flask_mongoengine import MongoEngine
from flask_restplus import Api

from config import config_by_name

db = MongoEngine()
api = Api()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config_by_name[config_name])

    db.init_app(app)
    api.init_app(app)

    from .foo import namespace as foo_namespace
    api.add_namespace(foo_namespace)
    return app

foo/__init__.py

from flask_restplus import Namespace

namespace = Namespace(
    "Foo",
    description="Foo and Bar and Baz",
    path="/Foo"
)

from app.foo import routes

foo/routes.py

#foo/routes.py
from flask import request
from flask_restplus import Resource, fields

from app.foo import namespace
from app.foo.models import Foo as Foo_ODM

foo_api_model = namespace.model(
    name="Foo",
    model={
        "name": fields.String(
            required=True,
            description="Identifier for a foo",
            example="GloVe-CommonCrawl-6b"
        ),
        "download_url": fields.Url(
            required=True,
            description="Endpoint for downloading a foo",
            example="http://nlp.stanford.edu/data/glove.6B.zip"
        ),
    }
)


@namespace.route("/<name>")
class Foo(Resource):
    @namespace.marshal_with(foo_api_model)
    def get(self, name):
        """Get metadata for a single foo by name"""
        foo = Foo_ODM.objects.get_or_404(name=name)
        return foo

    @namespace.marshal_with(foo_api_model)
    def delete(self, name):
        """"Remove a foo from the server"""
        # Create Mongo ODM and delete the relevant document
        return 404


@namespace.route("/")
class FooList(Resource):
    def get(self):
        """List avalible Foos"""
        ret_json = []
        for obj in Foo_ODM.objects:
            ret_json.append(
                {"name": obj.name, "download_url": obj.download_url}
            )
            if len(ret_json) >= 100:
                return ret_json, 202
        return ret_json

    @namespace.expect(foo_api_model, validate=True)
    def put(self):
        """Add a new Foo to this server"""
        req_json = request.get_json()
        new_foo = Foo_ODM(
            name=req_json.get("name"),
            download_url=req_json.get("download_url"),
        )
        new_foo.save()

Когда я запрашиваю /foo/, все маршруты работают должным образом. Я могу PUT предметов и GET полный список объектов.

Когда я запрашиваю /foo/6b (который является документом в базе данных):

curl -X GET "http://localhost:5000/foo/" -H "accept: application/json"

Я получаю следующую ошибку:

{
  "message": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again. You have requested this URI [/foo/6b] but did you mean /foo/<name> ?"
}

Когда я ожидаю такой результат, как:

{
  "name": "6b",
  "download_url": "internet.com/static/6b.tar",
}

Похоже, Flask-Restplus каким-то образом сжимает URL-адрес в список вместо строки, а переменная в маршруте не обрабатывается и не интерпретируется. У кого-нибудь есть предложения или советы? Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...