1

我目前正在尝试建立我的第一个烧瓶网站。

我使用这个 API 来获取网站的电影数据: https ://github.com/AnthonyBloomer/tmdbv3api

当我调用 API 以获取例如电影详细信息时:

from tmdbv3api import TMDb, Movie

tmdb = TMDb()
tmdb.api_key = XXX

# Define objects
movie = Movie()
def getmovie(movieid):
    film = movie.details(movieid)
    return film

它工作得很好,例如我将电影对象列表传递给 jinja,然后循环访问并访问详细信息,例如

{% for movie in movies %}
        <div class="card content" style="width: 10rem;">

            <div class="content-overlay"></div>
            <div class="card-img-overlay d-flex justify-content-end">
                <form action="/deletefromlist" method="post">
                    <input type="hidden" name="movieid" value="{{ movie.id }}" />
                    <button type="submit" class="btn btn-sm btn-danger">
                        <span class="material-icons">
                            remove
                        </span>
                    </button>
                </form>
            </div>
            <div class="content-details fadeIn-bottom">
                <span class="content-title">{{ movie.title }}</span>
            </div>

            <img class="content-image" src="https://image.tmdb.org/t/p/w300/{{ movie.poster_path }}"
                onerror="this.src='/static/imgs/default.png'" class="card-img" alt="{{ movie.title }}" />
        </div>
        {% else %}
        <div class="alert alert-warning" role="alert">
            Such empty. Try adding some movies.
        </div>
        {% endfor %}

这工作得很好。

我也想将电影对象中的数据存储在数据库中,这样我就不必一直访问 API:

(这会尝试在每次用户添加电影时将电影存储在数据库(SQLite3)中):

# Query db for watchlist, call API, then returns list of movie objects
def save_movie(movie_id):
m = movie.details(movie_id)

# check if already there
if db.execute("SELECT * FROM movies WHERE movie_id = :movie_id", movie_id=movie_id):
    return False

genre_1 = m.genres[0]["name"]
genre_2 = m.genres[1]["name"]
db.execute("INSERT INTO movies (movie_id, title, year, releasedate, running_time, imdb_id, status, overview, country, poster_path, genre_1, genre_2) VALUES (:movie_id, :title, :year, :releasedate, :running_time, :imdb_id, :status, :overview, :country, :poster_path, :genre_1, :genre_2)",
           movie_id=movie_id, title=m.title, year=m.release_date, releasedate=m.release_date, running_time=m.runtime, imdb_id=m.imdb_id, status=m.status, overview=m.overview, country=m.productioncountries, poster_path=m.poster_path, genre_1=genre_1, genre_2=genre_2)
return True

问题是,无论我尝试访问电影对象的哪个属性,都会出现以下错误,例如,如果我尝试获取 m.year:

AttributeError: 'AsObj' object has no attribute 'overview'

我尝试谷歌搜索但没有找到答案。我只是不明白为什么 jinja 访问电影对象的属性没有问题。但是蟒蛇有。

我想这与以后的“创建属性”有关吗?

先感谢您!

4

1 回答 1

0

在某些情况下,当字段为空时,TMDb API 会返回不完整的信息。

您可以通过使用getattr(object, name[, default])并提供回退值来处理此问题。

所以overview=m.overview你应该写而不是:

overview = getattr(m, 'overview', 'n/a')

顺便说一句,这也可能发生在其他属性上。就我而言,这是一个没有release_date.

于 2021-01-26T13:45:24.010 回答