亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在金賈2和燒瓶之間傳遞自定義蟒蛇對象

在金賈2和燒瓶之間傳遞自定義蟒蛇對象

Go
牧羊人nacy 2022-10-05 09:25:05
我是 Flask 和 Jinja2 以及 HTML 模板的新手,我正在嘗試學習如何在控制器和視圖之間來回傳遞信息?;旧?,我有一個事件日歷。每個事件名稱都是一個超鏈接,用于轉到包含有關該事件的詳細信息的視圖。但是,盡管我可以輕松地將自定義事件對象的列表傳遞到 HTML 文件中,但我不知道如何將選定的事件對象返回到控制器。據我所知,這個物體正在變成一個字符串。下面的簡化代碼。url_forapp.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>單擊該事件會將我帶到空白頁,大概是因為 event.html 正在嘗試獲取不存在的字符串對象的屬性。當將python對象傳遞到視圖中是如此簡單時,似乎可能有一種同樣簡單的方法可以將其從視圖中取回。請啟發我!
查看完整描述

3 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

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

<event>,在本例中為字符串。有關此內容的詳細信息,請參閱 Flask 快速入門。您不能像在這里嘗試的那樣通過URL傳遞任意對象。

通常,您在此處會有某種類型的 ID,可用于查找對象,可能是在數據庫中。在這種情況下,您將該 ID 傳遞到該 ID 中,該 ID 將生成一個類似于 的 URL。url_for()/events/123

然后,當您的路由被調用時,會在參數中為其指定 ID。然后,由您查找正確的對象并將其傳遞到模板中。eventevent


查看完整回答
反對 回復 2022-10-05
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

當您收到時,, 只是一個字符串,而不是一個對象。因此,您應該在數據庫中找到事件 ID,例如<event>


@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


查看完整回答
反對 回復 2022-10-05
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

使用自定義 URL 轉換器并提供一種序列化類的方法,這很快就會變得乏味:


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)

然后,按如下方式編寫轉換器:


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()

然后在使用以下命令創建應用程序時在 中聲明它:


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

請注意,這很好,我以前曾將其用于可以僅存儲在內存中的較小項目,但最好使用ID并將事件存儲在數據庫中。因此,假設您有一個應用程序工廠:


from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app():

    app = Flask(__name__)

    db.init_app(app)

    # etc.

您可以訪問數據庫并定義一個模型,如下所示:


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)

并傳遞 https://stackoverflow.com/a/61154232/5058116 中提到的。然后,您可以按如下方式查詢表/模型:<event_id>Event


from app.models.event import Event


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

def event(event_id):

    event = Event.query.get(event_id)

    # etc.


查看完整回答
反對 回復 2022-10-05
  • 3 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號