第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Jinja2 和 Flask 之間傳遞自定義 python 對象

在 Jinja2 和 Flask 之間傳遞自定義 python 對象

哈士奇WWW 2023-12-11 15:28:48
我是 Flask、Jinja2 和 HTML 模板的新手,我正在嘗試學(xué)習(xí)如何在控制器和視圖之間來回傳遞信息?;旧?,我有一個(gè)事件日歷。每個(gè)事件名稱都是一個(gè)超鏈接,用于url_for轉(zhuǎn)至包含有關(guān)該事件的更多信息的視圖。但是,盡管我可以輕松地將自定義事件對象列表傳遞到 HTML 文件中,但我不知道如何將選定的事件對象返回到控制器。據(jù)我所知,該對象正在變成一個(gè)字符串。下面的簡化代碼。app.pyfrom flask import Flask, render_template, url_forapp = Flask(__name__)class Event(object):    def __init__(self, name, date):        self.name = name        self.date = dateevents = [Event('event1', '2020-04-11')]@app.route('/')def index():    return render_template('index.html', events=events)@app.route('/event/<event>')def event(event):    return render_template('event.html', event=event)索引.html<!DOCTYPE html><html><body>    {% for event in events %}        <a href={{ url_for('event', event=event) }}>{{ event.name }}</a>    {% endfor %}</body></html>事件.html<!DOCTYPE html><html><body>    <p>{{ event.name }} {{ event.date }}</p></body></html>單擊該事件會(huì)將我?guī)У揭粋€(gè)空白頁面,大概是因?yàn)?event.html 正在嘗試獲取不存在的字符串對象的屬性。當(dāng)將 python 對象傳遞到視圖中如此簡單時(shí),似乎有一種同樣簡單的方法可以將其從視圖中返回。請賜教!
查看完整描述

3 回答

?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

@app.route('/event/<event>')

<event>,在本例中,是一個(gè)字符串。

通常,您會(huì)在此處擁有某種 ID,可用于查找對象(可能在數(shù)據(jù)庫中)。在這種情況下,您可以將該 ID 傳遞到其中url_for(),從而生成類似 的 URL?/events/123。

然后,當(dāng)您的event路由被調(diào)用時(shí),它會(huì)在參數(shù)中獲得 ID?event。然后由您來查找正確的對象并將其傳遞到您的模板中。


查看完整回答
反對 回復(fù) 2023-12-11
?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

當(dāng)您收到<event>, 只是一個(gè)字符串,而不是一個(gè)對象。所以你應(yīng)該在你的數(shù)據(jù)庫中找到事件ID,比如


@app.route('/event/<event>')

def event(event):

    e=db.find_event(event) # event is the event number or id 

    if e:

        return render_template('event.html', event=e)

    else:

        return f'Event {event} not found', 404


查看完整回答
反對 回復(fù) 2023-12-11
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

這可以使用自定義 URL 轉(zhuǎn)換器并提供序列化類的方法,這很快就會(huì)變得乏味:


from __future__ import annotations

import json


class Event():


? ? def __init__(self, name, date):

? ? ? ? self.name = name

? ? ? ? self.date = date


? ? def to_url(self):

? ? ? ? name = self.name.replace(' ', '+')

? ? ? ? # format the date similarly

? ? ? ? return f'name+{name}+date+{self.date}'


? ? @classmethod

? ? def from_url(cls, url: str):

? ? ? ? # extract name and date from url ...

? ? ? ? event = Event(name, date)

然后,您可以按如下方式編寫轉(zhuǎn)換器:


from werkzeug.routing import BaseConverter

from app.models.event import Event


class EventConverter(BaseConverter):


? ? def to_python(self, url):

? ? ? ? return Event.from_url(url)


? ? def to_url(self, event):

? ? ? ? return event.to_url()

然后在創(chuàng)建應(yīng)用程序時(shí)使用以下方法聲明它:


from app.converters.event_converter import EventConverter


# etc.

app.url_map.converters['event'] = EventConverter # add URL converters.

并將其用于您的路線,例如:


@app.route('/event/<event:event>')

def event(event):

? ? pass

請注意,這很好,我之前曾將它用于較小的項(xiàng)目,您可以將其僅存儲在內(nèi)存中,但您最好使用 ID 并將事件存儲在數(shù)據(jù)庫中。因此,假設(shè)您有一個(gè)應(yīng)用程序工廠:


from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():

? ? app = Flask(__name__)

? ? db.init_app(app)

? ? # etc.

您將訪問數(shù)據(jù)庫并定義一個(gè)模型,如下所示:


from app import db


class Event(db.Model)

? ? id = db.Column(db.Integer, primary_key=True)

? ? name = db.Column(db.String, nullable=False)

? ? date = db.Column(db.DateTime, nullable=False)

后您可以按如下方式查詢表/模型:Event


from app.models.event import Event


@app.route('/event/<int:event_id>')

def event(event_id):

? ? event = Event.query.get(event_id)

? ? # etc.


查看完整回答
反對 回復(fù) 2023-12-11
  • 3 回答
  • 0 關(guān)注
  • 198 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號