#python #jinja2 #fastapi #url-for
Вопрос:
Я пытался запустить простое приложение fastapi
и использовал jinja2
его для создания шаблонов. Я хотел оформить свой шаблон с помощью css. Я положил файл в static/styles.css
папку . И я использовал url_for
этот файл всякий раз, когда запускал приложение hypercorn main:app
. Я получаю эту ошибку:
Error: 'url_for' is undefined
вот мое приложение
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from send_mail import SendEmail
app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/")
def read_root():
SendEmail(subject="Test", template_name="child")
return 'succeed'
а вот мой шаблон джинджа
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello World</title>
<link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
</body>
</html>
и вот кодекс sendEmail
:
import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
from sendgrid.helpers.mail import Email
from sendgrid.helpers.mail import Content
from jinja2 import FileSystemLoader, Environment, select_autoescape
...
def SendEmail(to_email, subject, template_name):
try:
# render jinja template
templateLoader = FileSystemLoader(searchpath="templates")
templateEnv = Environment(
loader=templateLoader,
autoescape=select_autoescape(['html', 'xml'])
)
html_template = templateEnv.get_template(template_name ".html")
html_to_send = html_template.render()
html_content = Content("text/html", html_to_send)
# copose the Mail
message = Mail(
...
html_content=html_content
)
sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
response = sg.send(message)
except Exception as e:
print("Error: {0}".format(e))
Комментарии:
1. Что внутри
send_mail
иSendEmail
? Как вы просите, чтобы шаблоны были отрисованы? FastAPI предполагает, что вы используетеJinja2Templates
модуль, если хотите, чтобы эти функции были доступны (они не являются специфичными для Jinja2, они предоставляются платформой вокруг Jinja2). fastapi.tiangolo.com/advanced/templates/#using-jinja2templates2. Я обновлю вопрос, send_mail-это скрипт, содержащий функцию отправки почты, я добавлю в него содержимое
3.
url_for
Метод является методом дляRequest
объекта, поэтому, если вы собираетесь либо использовать предварительно настроенный контекст с помощью поддержки шаблонов, как указано выше, либо включитьrequest: Request
в свой метод представления и передать его функции отправки почты.request.url_for(...)
4. С использованием этого « шаблоны = Jinja2Templates(каталог=»шаблоны») html_content = шаблоны. Шаблон ответа(«child.html», {«запрос»: запрос})« Я получаю эту ошибку:
Error: '_TemplateResponse' object has no attribute 'mime_type'
. Не мог бы я вместо этого придерживаться первого кода и щелкнуть его, чтобы устранить проблему? или, если мне следует использовать второй подход, не могли бы вы поделиться примером кода, чтобы прояснить возникшую у меня путаницу