какой параметр мы должны передать в форме action url_for, который указывает на страницу buleprint в flask? - PullRequest
0 голосов
/ 01 августа 2020

Я преобразовал свое приложение python для использования схемы функциональной структуры, у меня есть форма подписки в HTML, так что когда мы вызываем маршрут localhost / subscribe, мы читаем ввод формы и добавляем пользователя для подписки HTML код:

<form  method="POST" action="{{ url_for('subscribe') }}"> <!--{{ url_for('subscribe') }} -->
    <div class="container">
        <h2>Subscribe to our Newsletter</h2>
        <p>Lorem ipsum..</p>
    </div>

    <div class="container" style="background-color:white">
        <input type="text" placeholder="Name" name="name" required>
        <input type="email" placeholder="Email address" name="mail" required>
        <label>
            <input type="checkbox" checked="checked" name="subscribe"> Daily Newsletter
            <select>
                <option></option>
            </select>
        </label>
    </div>

    <div class="container">
        <input type="submit" value="submit">
    </div>
    <div>

        

        <span>{{result}}</span>


    </div>
</form> 

Файл subcribe.py Blueprint выглядит следующим образом:

from flask import Blueprint, render_template, request

from DBConnection import Mongodb

subscribe_blueprint = Blueprint('subscribe', __name__)
@subscribe_blueprint.route('/subscribe', methods=['GET', 'POST'])
def subscribe():
    print(request.method)
    if request.method == "POST":
        print('inside POST')
        subscribers = get_subscribers_collection()
        subscribe_date = datetime.utcnow
        subscriber_email, subscriber_name = read_form_data()

        existing_subscriber = is_subscribed(subscribers, subscriber_email)
        if existing_subscriber is None:

            add_subscriber(subscribers, subscriber_name, subscriber_email)
        else:
            result = {'email': subscriber_email + 'Alreday sucscribed!'}
            return render_template("subscribe/subscribe.html", result=result)
    else:
        return render_template("subscribe/subscribe.html", result="{'key':'value'}")

и в приложении. y я зарегистрировал его

from views.subscribe import subscribe_blueprint
app.register_blueprint(subscribe_blueprint)

Когда я вызываю маршрут http://127.0.0.1: 5000 / subscribe : появляется следующая ошибка:

Traceback (most recent call last):
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\fr-pa\Desktop\content_aggregator\views\subscribe.py", line 27, in subscribe
    return render_template("subscribe/subscribe.html", result="{'alaa':'dddd'}")
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\templating.py", line 137, in render_template
    return _render(
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\templating.py", line 120, in _render
    rv = template.render(context)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\jinja2\environment.py", line 1090, in render
    self.environment.handle_exception()
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\jinja2\environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\jinja2\_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\fr-pa\Desktop\content_aggregator\templates\subscribe\subscribe.html", line 1, in top-level template code
    {% extends "layout.html" %}
  File "C:\Users\fr-pa\Desktop\content_aggregator\templates\layout.html", line 35, in top-level template code
    <div id="content">{% block content %}{% endblock %}</div>
  File "C:\Users\fr-pa\Desktop\content_aggregator\templates\subscribe\subscribe.html", line 11, in block "content"
    <form  method="POST" action="{{ url_for('subscribe') }}"> <!--{{ url_for('subscribe') }} -->
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\helpers.py", line 370, in url_for
    return appctx.app.handle_url_build_error(error, endpoint, values)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\app.py", line 2216, in handle_url_build_error
    reraise(exc_type, exc_value, tb)
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\flask\helpers.py", line 357, in url_for
    rv = url_adapter.build(
  File "C:\Users\fr-pa\AppData\Local\Programs\Python\Python38\Lib\site-packages\werkzeug\routing.py", line 2179, in build
    raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'subscribe'. Did you mean 'subscribe.subscribe' instead?

1 Ответ

0 голосов
/ 02 августа 2020

Чтобы создать URL-адрес внутри чертежа, вам необходимо указать имя чертежа. Передача конечной точки на url_for() должна иметь форму <blueprint_name>.<view_function_name>. В вашем случае это значение будет subscribe.subscibe.

action="{{ url_for('subscribe.subscribe') }}"

PS Когда вы используете url_for в текущем чертеже, вы можете сократить значение конечной точки до .subscribe.

...