from app import db
from sqlalchemy.orm import Mapped, mapped_column
from datetime import datetime, timezone
class Blog_Post(db.Model):
__tablename__ = "blog_post"
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(db.String(60), nullable=False)
body: Mapped[str] = mapped_column(nullable=False)
image : Mapped[str] = mapped_column(nullable=False)
author: Mapped[str] = mapped_column(nullable=False)
date_created: Mapped[datetime] = mapped_column(nullable=False, default=datetime.now(timezone.utc))
как вы видите, я сохраняю заголовок, тело, автора, изображение (только путь к img, которые хранятся в такой папке:
@app.route("/create_post", methods=["POST", "GET"])
@login_required
def create_post():
form = CreatePostForm()
user_id_folder = 'user-' + current_user.get_id()
user_folder = os.path.join(
app.static_folder, 'images', user_id_folder, 'post'
).replace('\\', '/')
if form.validate_on_submit():
f = form.file.data
filename = secure_filename(f.filename)
if filename:
try:
#check that the 'images/post/' folder exists, else it creates it
if not os.path.exists(user_folder):
os.makedirs(os.path.join(
user_folder
))
#built-in flask-wtf function to save images
final_save = os.path.join(
user_folder, filename
).replace('\\', '/')
f.save(final_save)
#charging post to database, only storing path to the image in the database
post = Blog_Post(
title= form.title.data,
body=form.body.data,
image = filename,
author= current_user.username)
db.session.add(post)
db.session.commit()
return redirect('/')
except Exception as e:
app.log_exception(f'There was an error uploading the image: {e=}')
abort(400)
except Exception as e:
return f"There was an error with creating the post: {e=}"
return render_template("posts/create_post.html", form=form)
и дату. Я сохраняю его как UTC, а до тех пор у меня нет проблем, я бы сделал это так же просто, как {{ post.date_created.strf(something)}}, и это помогло бы.
Затем на главной странице, где есть сетка, показывающая изображение, заголовок, дату_создания и автора, я подумал: «Разве у людей не будут разные часовые пояса?». Итак, я начал искать, как конвертировать UTC в местные часовые пояса, и решил просто запросить локальный часовой пояс из браузера, передать его в одно представление, а затем выполнить преобразование.
Главная страница, на которой будут отображаться все созданные сообщения. я показываю следующее:
{% extends 'base.html' %}
{% block head %}
{% endblock %}
{% block title %} Home {% endblock%}
{% block body %}
{% for post in posts%}
{% if current_user.is_authenticated%}
{% else %}
{% endif %}
{{post.title}}
Date: {{url_for('convert_timezone', utc=post.date_created)}}
Author: {{post.author}}
{% endfor %}{% endblock %}
Просмотр, откуда я запрашиваю часовой пояс из браузера (он работает):
@app.route('/save-timezone', methods=['POST'])
def save_timezone():
print(f"Request path: {request.path}")
data = request.json
user_timezone = data.get('timezone') # Example of timezone: "America/New_York"
print(f"Received timezone: {user_timezone}")
return user_timezone
а затем у меня есть специальная функция, которая преобразует ее с использованием user_timezone с помощью функции astimezone из datetime, но я не знаю, как использовать значение, возвращаемое этим представлением, в другой функции , я попробовал следующее:
@app.route("/convert_timezone//", defaults={'user_timezone' : 'save_timezone()'})
но это дает мне только:
Date: /convert_timezone/2025-01-02%2013:58:31.110859/save_timezone()
Очевидная причина в том, что save_timezone() не вызывается, поскольку находится в кавычках, но когда я пытаюсь вызвать его, я получаю:Traceback (most recent call last):
File "C:\Programing utilities\Ps\Flask\Flask_tutorial-uniwebsidad\Web-Blog\run.py", line 1, in
from app import db, app
File "C:\Programing utilities\Ps\Flask\Flask_tutorial-uniwebsidad\Web-Blog\app\__init__.py", line 25, in
from app import routes
File "C:\Programing utilities\Ps\Flask\Flask_tutorial-uniwebsidad\Web-Blog\app\routes.py", line 157, in
^^^^^^^^^^^^^^^
File "C:\Programing utilities\Ps\Flask\Flask_tutorial-uniwebsidad\Web-Blog\app\routes.py", line 150, in save_timezone
print(f"Request path: {request.path}")
^^^^^^^^^^^^
File "c:\Programing utilities\Ps\Flask\Flask_tutorial-uniwebsidad\Web-Blog\.venv\Lib\site-packages\werkzeug\local.py", line 318, in __get__
obj = instance._get_current_object()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\Programing utilities\Ps\Flask\Flask_tutorial-uniwebsidad\Web-Blog\.venv\Lib\site-packages\werkzeug\local.py", line 519, in _get_current_object
raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of request context.
This typically means that you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.
Итак, я хочу знать, делаю ли я что-то не так (что это?), Это слишком сложно для простого шаблона блога, или мне следует просто проигнорировать это и оставить в формате UTC. ?
Редактировать:
Итак, поскольку был один человек, который просил полное представление и функцию js:
const user_timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
// sending request
fetch('/save-timezone', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ timezone: user_timezone })
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch(error => console.error('Error:', error));
Полное представление и пользовательская функция:
@app.route("/convert_timezone//", defaults={'user_timezone' : 'save_timezone()'})
def convert_timezone(utc, user_timezone):
return utc2local(utc, user_timezone)
Пользовательская функция (utc2local):
from zoneinfo import ZoneInfo
from datetime import datetime
def utc2local(utc_reference, local_timezone):
if isinstance(utc_reference, str):
utc_reference = datetime.fromisoformat(utc_reference)
local_time = utc_reference.astimezone(tz=ZoneInfo(local_timezone))
return local_time
Подробнее здесь: https://stackoverflow.com/questions/793 ... -data-bein
Мобильная версия