当前位置: 首页 > 面试题库 >

在Django中使用来自RESTFUL API的数据的正确方法

庄阿苏
2023-03-14
问题内容

我正在尝试学习django,所以当我有一个当前的解决方案时,我不确定它是否遵循django中的最佳实践。我想在我的网站上显示来自Web api的信息。假设api网址如下:

http://api.example.com/books?author=edwards&year=2009
Thsis将返回Edwards在2019年写的书籍清单。以以下格式返回:

{'results':
             [
                {
                   'title':'Book 1',
                   'Author':'Edwards Man',
                   'Year':2019
                },
                {
                   'title':'Book 2',
                   'Author':'Edwards Man',
                   'Year':2019}
           ]
}

目前,我正在如下视图中使用API​​:

class BooksPage(generic.TemplateView):
    def get(self,request):
        r = requests.get('http://api.example.com/books?author=edwards&year=2019')
        books = r.json()
        books_list = {'books':books['results']}
        return render(request,'books.html',books_list)

通常,我们从models.py文件中的数据库中获取数据,但是我不确定是否应该在models.py或views.py中获取此API数据。如果应该在models.py中,可以有人提供如何执行此操作的示例吗?我为stackoverflow专门编写了上面的示例,因此任何错误纯粹是在此处编写的结果。


问题答案:

我喜欢将这种逻辑放在单独的服务层(services.py)中的方法;从Django ORM的角度来看,你呈现的数据不是一个“模型”,它不仅仅是简单的“视图”逻辑。干净的封装可确保你执行以下操作:控制与支持服务的接口(即,使其看起来像Python API还是带有参数的URL),添加诸如缓存的增强功能(如@sobolevn所述),单独测试API,等等

所以我建议一个简单的services.py,看起来像这样:

def get_books(year, author):
    url = 'http://api.example.com/books' 
    params = {'year': year, 'author': author}
    r = requests.get(url, params=params)
    books = r.json()
    books_list = {'books':books['results']}
    return books_list

注意如何传递参数(使用requests软件包的功能)。

然后在views.py

import services
class BooksPage(generic.TemplateView):
    def get(self,request):
        books_list = services.get_books('2009', 'edwards')
        return render(request,'books.html',books_list)


 类似资料:
  • 我正在学习django,所以虽然我有一个当前的解决方案,但我不确定它是否遵循了django的最佳实践。我想在我的网站上显示来自web api的信息。假设api url如下所示: 目前我正在使用视图文件中的API,如下所示: 通常,我们在models.py文件中从数据库中获取数据,但我不确定应该在models.py还是views.py中获取API数据。如果它应该在models.py中,有人能提供一个

  • 问题内容: 这可能是一个愚蠢的问题,但是我想使用Modernizr JS库检测一些浏览器属性,以确定要显示或不显示什么内容。 我有一个名为Pano2VR的应用程序,它可以同时输出HTML5和SWF。我需要用于iOS设备用户的HTML5。 但是,IE根本不呈现此“ HTML5”输出。看来他们的输出使用CSS3 3D变换和WebGL,IE9中显然不支持一种或多种。 因此,对于那些用户,我需要显示Fla

  • 问题内容: 我刚刚在我的项目中发现了一些这样的sql查询构建: 这是否达到其目标,即减少内存使用量? 我对此表示怀疑,因为在构造函数中使用了“ +”(字符串concat运算符)。像下面的代码那样,将占用与使用String相同的内存量吗?我了解,使用时有所不同。 两条语句的内存使用量是否相等?请澄清。 提前致谢! 编辑: 顺便说一句, 这不是我的代码 。在一个旧项目中发现它。而且,查询的大小不如我的

  • 当我试图验证来自WooCommerce webhooks的签名时,我遇到了一个奇怪的问题。以下是我用来创建签名的部分: 它适用于每个带有主题的网络钩子,请求正文等于这样的内容: 不幸的是,对于每个具有或主题的网络钩子,我的签名都不一样。请求正文也更复杂。 我认为JSON出现了一些问题。当请求正文更复杂时,使用stringify()。 验证来自WooCommerce webhooks的签名的正确方法

  • 问题内容: 让我解释一下:我并不是在问将特定日期时间的时区存储在数据库中的正确方法。我说的是时区本身。例如: 我有一个名为“用户”的MySQL表。现在,在此表上,我希望有一列包含用户居住地的时区(由用户提供,将从列表中选择)。我正在使用PHP,其中包含类似以下时区字符串的列表: 美国时区列表 现在,显而易见的解决方案(至少对我而言)是在“用户”表中创建VARCHAR列,然后将PHP使用的时区字符串

  • 问题内容: 我正在尝试在postgresql中创建数据透视表类型视图,并且快要完成了!这是基本查询: 和数据: 我想要得到的是以下内容: 我正在尝试使用CASE WHEN进行此操作,因此我得到了以下信息: 这给了我输出: 现在我知道我必须在某个时候按acc分组,所以我尝试 但我感到恐惧 我能够找到的所有先前示例在CASE语句周围都使用了SUM()之类的东西,所以我想那是聚合函数。我尝试使用FIRS