Как я могу заставить это значение по умолчанию работать, поскольку значение представляет собой представление с данными, Python

Программы на Python
Ответить
Anonymous
 Как я могу заставить это значение по умолчанию работать, поскольку значение представляет собой представление с данными,

Сообщение Anonymous »

Итак, я создаю приложение с flask с flask.sqlalchemy, flask-forms, flask-login, в этом приложении у меня есть различные модели, и одна из них такая:
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
Ответить

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

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

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

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

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