Ошибка fastapi: ‘url_for’ не определен в шаблоне jinja2

#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-jinja2templates

2. Я обновлю вопрос, 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' . Не мог бы я вместо этого придерживаться первого кода и щелкнуть его, чтобы устранить проблему? или, если мне следует использовать второй подход, не могли бы вы поделиться примером кода, чтобы прояснить возникшую у меня путаницу