Ошибка создания URL-адреса для конечной точки Flask с использованием Flask-Marshmallow.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка создания URL-адреса для конечной точки Flask с использованием Flask-Marshmallow.

Сообщение Anonymous »

Я разрабатываю RESTful API с помощью Flask и столкнулся с проблемой при попытке создать URL-адреса для своих конечных точек с помощью Flask-Marshmallow. Всякий раз, когда я получаю доступ к маршруту, который использует ma.URLFor в моей схеме Marshmallow, я сталкиваюсь со следующей ошибкой:

Код: Выделить всё

werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'cursodetail'. Did you forget to specify values ['id']?
Вот как я настраиваю схему CursoSchema:

Код: Выделить всё

from api import ma
from ..models import curso_model
from marshmallow import fields

class CursoSchema(ma.SQLAlchemyAutoSchema):
class Meta:
model = curso_model.Curso
load_instance = True
fields = ("id", "nome", "descricao", "_links")

nome = fields.String(required=True)
descricao = fields.String(required=True)

_links = ma.Hyperlinks(
{
"get": ma.URLFor("cursodetail", id=""),
"put": ma.URLFor("cursodetail", id=""),
"delete": ma.URLFor("cursodetail", id="")
}
)
Мои маршруты определены в curso_views.py следующим образом:

Код: Выделить всё

from flask import Blueprint, jsonify, request
from flask.views import MethodView
from api import db, ma
from ..models import curso_model
from ..schemas import curso_schema

curso_bp = Blueprint('curso', __name__)

class CursoListView(MethodView):
def get(self):
cursos = curso_model.Curso.query.all()
return jsonify(curso_schema.CursoSchema(many=True).dump(cursos))

curso_bp.add_url_rule('/cursos', view_func=CursoListView.as_view('curso_list'))

# Endpoint for course details
@curso_bp.route('/cursos/', methods=['GET', 'PUT', 'DELETE'])
def cursodetail(id):
curso = curso_model.Curso.query.get_or_404(id)
if request.method == 'GET':
return jsonify(curso_schema.CursoSchema().dump(curso))
elif request.method == 'PUT':
# Logic to update the course
return jsonify(message='Course updated successfully')
elif request.method == 'DELETE':
# Logic to delete the course
return jsonify(message='Course deleted successfully')
ошибка моего терминала:

Код: Выделить всё

C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Scripts\python.exe C:\Users\ferre\PycharmProjects\FlaskAPIflask\api\run.py
* Serving Flask app 'api'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment.  Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 108-576-652
127.0.0.1 - - [09/Jul/2024 20:38:58] "GET /cursos HTTP/1.1"  500 -
Traceback (most recent call last):
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 1498, in __call__
return self.wsgi_app(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 1476, in wsgi_app
response = self.handle_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 298, in error_router
return original_handler(e)
^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 295, in error_router
return self.handle_error(e)
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 310, in handle_error
_handle_flask_propagate_exceptions_config(current_app, e)
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 1473, in wsgi_app
response = self.full_dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 882, in full_dispatch_request
rv = self.handle_user_exception(e)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 298, in error_router
return original_handler(e)
^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 295, in error_router
return self.handle_error(e)
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 310, in handle_error
_handle_flask_propagate_exceptions_config(current_app, e)
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 880, in full_dispatch_request
rv = self.dispatch_request()
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 865, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 489, in wrapper
resp = resource(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\views.py", line 110, in view
return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type:  ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_restful\__init__.py", line 604, in dispatch_request
resp = meth(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\api\views\curso_views.py", line 13, in get
return paginate(Curso,cs)
^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\api\paginate.py", line 24, in paginate
'results':schema.dump(page_obj.items)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\marshmallow\schema.py", line 549, in dump
result = self._serialize(processed_obj, many=many)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\marshmallow\schema.py", line 512, in _serialize
self._serialize(d, many=False)
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\marshmallow\schema.py", line 517, in _serialize
value = field_obj.serialize(attr_name, obj, accessor=self.get_attribute)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\marshmallow\fields.py", line 341, in serialize
return self._serialize(value, attr, obj, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_marshmallow\fields.py", line 209, in _serialize
return _rapply(self.schema, _url_val, key=attr, obj=obj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_marshmallow\fields.py", line 158, in _rapply
return {key: _rapply(value, func, *args, **kwargs) for key, value in d.items()}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_marshmallow\fields.py", line 160, in _rapply
return func(d, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_marshmallow\fields.py", line 168, in _url_val
return val.serialize(key, obj, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\marshmallow\fields.py", line 341, in serialize
return self._serialize(value, attr, obj, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask_marshmallow\fields.py", line 124, in _serialize
return url_for(self.endpoint, **param_values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\helpers.py", line 220, in url_for
return current_app.url_for(
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 1084, in url_for
return self.handle_url_build_error(error, endpoint, values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\flask\app.py", line 1073, in url_for
rv = url_adapter.build(  # type: ignore[union-attr]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ferre\PycharmProjects\FlaskAPIflask\.venv\Lib\site-packages\werkzeug\routing\map.py", line 924, in build
raise BuildError(endpoint, values, method, self)
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'cursodetail'. Did you forget to specify values ['id']?
myterminalpycharm
Я проверил, что методы HTTP (GET, PUT, DELETE) верны и что конечная точка cursodetail определена с идентификатором параметр. Однако я продолжаю получать вышеупомянутую ошибку при попытке доступа к маршруту. Как я могу решить эту проблему?

Подробнее здесь: https://stackoverflow.com/questions/787 ... arshmallow
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»