Доброго времени суток!
Я новичек в Python, сейчас изучаю Flask, сильно не бейте. Столкнулся со следующей сложностью: скажем так, из базы данных выводятся список статей, которые сам пользователь добавляет. Так вот, на каждый заголовок статьи должна быть ссылка, куда можно перейти и читать разные комментарии под статьей, куда опять же может добавлять любой пользователь. Сложность в том, как мне сгенерировать эти ссылки, а в частности отдельные html файлы на каждую статью, которые создает пользователь. Я приведу свой код(часть кода я намеренно опускаю, но если потребуется, могу предоставить), как пытался сделать я:
app.py
@app.route('/art/<articles_id>', methods=['GET', ])
def article_id(articles_id):
from models import Article
article = Article.query.filter_by(id=articles_id).first_or_404()
return render_template('art.html', article=article)
@app.route('/index', methods=['GET', ])
@app.route('/', methods=['GET', ])
def index():
from models import Comment
from models import Article
comment = Comment.query.all()
article = Article.query.all()
return render_template('index.html', comment=comment, article=article)
index.html
<div class="container-fluid">
{% for articles in article %}
<h4>Заголовок: <a href="{{ url_for('art', articles_id=articles.id) }}">{{ articles.id }} {{articles.title }}</a> <small>Дата создания: {{ articles.data }}</small></h4 >
Комментарии:
<p>{{ articles.first_post }}</p>
{% for comments in comment %}
{% if articles.id == comments.article_id %}
<p class="container"> <mark>{{ comments.post }}</mark>
<br /><small>{{ comments.data }}</small> </p>
{% endif %}
{% endfor %}
{% endfor %}
art.html
<html>
<head>
<title>test</title>
</head>
<body>
<h1>{{ article.id }}</h1>
</body>
</html>
Получаю следующую ошибку: werkzeug.routing.BuildError
werkzeug.routing.BuildError: Could not build url for endpoint 'app.art' with values ['articles_id']. Did you mean 'article' instead?
Спасибо за ваше терпение и внимание.
Я решил свою проблему сам с помощью т.н. blueprint. Если вкратце:
Blueprint’ы во Flask могут пригодиться в случае, если нужно:
Разделить приложения на набор blueprint’ов. Они идеальны для больших приложений; проект должен создать объект приложения, инициализировав несколько расширений, и зарегистрировав набор blueprint’ов.
Зарегистрировать blueprint в приложении по определённом префиксу URL и/или в поддомене. Параметры в префиксе URL или поддомене становятся обычными аргументами представлений (со значениями по умолчанию) для всех функций представлений в blueprint’е.
Зарегистрировать blueprint несколько раз в приложении с разными правилами URL.
Предоставить фильтры шаблонов, статический файлы, шаблоны и другие вспомогательные средства с помощью blueprint’ов. Blueprint не является реализацией приложения или функций представлений.
Более подробная информация в документации: http://flask-russian-docs.readthedocs.io/ru/latest/blueprints.html на русском языке.
app.py
from flask import Flask, Blueprint, request, render_template, flash, redirect, url_for, abort
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from jinja2 import TemplateNotFound
import config
app = Flask(__name__, template_folder='templates')
app.config.from_object(config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
#ДОБАВИЛ СЮДА
blueprint_page = Blueprint('blueprint_page', __name__, template_folder='templates')
#ИЗМЕНИЛ РОУТЫ
@blueprint_page.route('/article', methods=['POST', ])
def article():
from models import Article
from forms import ArticleForm
if request.method == 'POST':
form = ArticleForm(request.form)
if form.validate():
art = Article(**form.data)
db.session.add(art)
db.session.commit()
flash('Article created!')
return redirect(url_for('index'))
else:
flash('Connot to create an article!')
flash(str(form.errors))
return 'Connot to create an article!'
@blueprint_page.route('/art/')
@blueprint_page.route('/art/<id>', methods=['GET', ])
def art(id):
from models import Article, Comment
article = Article.query.filter_by(id=id).first_or_404()
comment = Comment.query.all()
try:
return render_template('art1.html', article=article, comment=comment)
except TemplateNotFound:
abort(404)
@blueprint_page.route('/comment', methods=['POST', ])
def comment():
from models import Comment
from forms import CommentForm
if request.method == 'POST':
form = CommentForm(request.form)
if form.validate():
com = Comment(**form.data)
db.session.add(com)
db.session.commit()
flash('Comment added!')
return redirect(url_for('/art/<id>'))
else:
flash('Connot to add a comment!')
flash(str(form.errors))
return 'Connot to add a comment!' + str(form.errors)
@blueprint_page.route('/index', methods=['GET', ])
@blueprint_page.route('/', methods=['GET', ])
def index():
from models import Comment
from models import Article
comment = Comment.query.all()
article = Article.query.all()
return render_template('index.html', comment=comment, article=article)
if __name__ == '__main__':
from models import *
db.create_all()
#ДОБАВИЛ СЮДА
app.register_blueprint(blueprint_page)
if Comment.query.count() == 0:
print('База пуста')
app.run()
index.html
<div class="container-fluid">
{% for articles in article %}
<!-- ДОБАВИЛ ТОЧКУ ПЕРЕД URL art -->
<h4>Заголовок: <a href="{{ url_for('.art', articles_id=articles.id) }}">{{ articles.id }} {{articles.title }}</a> <small>Дата создания: {{ articles.data }}</small></h4 >
Комментарии:
<p>{{ articles.first_post }}</p>
{% for comments in comment %}
{% if articles.id == comments.article_id %}
<p class="container"> <mark>{{ comments.post }}</mark>
<br /><small>{{ comments.data }}</small> </p>
{% endif %}
{% endfor %}
{% endfor %}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите, как изменить поведение carousel так, чтобы лишь при наведении мыши на фото- слайдер прокручивался,в остальных случаях - оставался...
Имеется блок в него используя append() вставляется абсолютно позиционированное изображение и поверх еще svgНо раз это все абсолютное соответственно...