今天我们将构建一个简单的 Web 应用,用于显示 MyAnimeList 上当前季度的动漫。如果你关注我的Twitter,你就会知道我是个超级动漫迷。MyAnimeList 是一个提供信息、评论和排名的平台,因此它是最佳选择。然而,它没有 API 或 SDK 来访问其内容。通常情况下,我们必须抓取网站数据,幸运的是,优秀的社区创建了Jikan Api 以及jikanpy,它是该 API 的 Python 包装器。
# app/models.py
fromdataclassesimportdataclass@dataclassclassAnime:"""
class to model anime data
"""mal_id:inturl:strtitle:strimage_url:strsynopsis:strtype:strairing_start:strepisodes:intmembers:int
该文件将保存我们所有的模型,这里我们创建一个 Anime 类来保存来自 Api 的数据。我们从dataclasses模块导入了 dataclass 装饰器。这将使我们能够访问各种特殊方法,从而使我们的代码简洁明了。我们将装饰器附加到类上,然后继续定义来自 Api 的数据结构。查看文档了解更多信息。
请求,请求...
将以下内容添加到anime_request.py文件:
# app/anime_request.py
fromjikanpyimportJikanfrom.modelsimportAnimejikan=Jikan()# function to get seasonal anime
defget_season_anime():"""
function to get the top anime from My anime list
:return: list of anime
"""season_anime_request=jikan.season()season_anime=[]ifseason_anime_request['anime']:response=season_anime_request['anime']foranimeinresponse:mal_id=anime.get('mal_id')url=anime.get('url')title=anime.get('title')image_url=anime.get('image_url')synopsis=anime.get('synopsis')type=anime.get('type')airing_start=anime.get('airing_start')episodes=anime.get('episodes')members=anime.get('members')new_anime=Anime(mal_id,url,title,image_url,synopsis,type,airing_start,episodes,members)season_anime.append(new_anime)returnseason_anime
在上面的代码中,我们从 jikanpy 模块导入了 Jikan 类,这将使我们能够访问各种方法向 Jikan Api 发出请求。我们还从models文件中导入了 Anime 类。我们创建一个变量 jikan 并为其分配一个 Jikan 类的实例。 现在,我们定义get_season_anime函数来向 Jikan Api 发出请求并将其附加到列表中。我们创建一个从 Jikan 类season_anime_request调用season方法的变量。它接受两个参数:年份和季节,当您想要从年份甚至季节中检索特定数据时,这非常方便。在我们的例子中,我们没有指定以获取当前季节的动漫。然后,我们定义一个空列表来保存我们的数据。
season 方法返回一个包含各种键值对的字典。我们需要的数据是anime键对应的值,它是一个字典列表。我们添加一个 if 语句来检查所需的键是否存在,然后循环遍历所有值。我们创建适当的变量来引用响应中的数据。我们 创建一个new_animeAnime 类的实例变量。我们将类添加到空列表中,最后返回类列表。
每日浏览量
在您的文件中添加以下代码views.py。
fromflaskimportrender_templatefrom.anime_requestimportget_season_animefrom.importapp@app.route('/',methods=['GET','POST'])defindex():"""
root page view that returns the index page and its data
:return: index template
"""season_anime=get_season_anime()returnrender_template('index.html',season_anime=season_anime)
此文件保存了我们 Flask 应用程序的路由。目前我们只有一个,欢迎添加更多。我们首先导入render_template它,它将在浏览器中渲染我们的 HTML 页面并传递任何所需的参数。我们还get_season_anime从 anime_request 文件中导入了函数。我们还从__init__.py文件中导入了我们的应用程序,这样就可以使用@app暴露路由方法的装饰器了。这会注册作为参数传递的路由以及该路由允许使用的方法。