当前位置: 首页 > 知识库问答 >
问题:

在django中使用RESTFUL API数据的正确方法

屠嘉勋
2023-03-14

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

http://api.example.com/books?author=edwards&year=2009
{'results':
             [
                {
                   'title':'Book 1',
                   'Author':'Edwards Man',
                   'Year':2009
                },
                {
                   'title':'Book 2',
                   'Author':'Edwards Man',
                   'Year':2009}
           ]
}

目前我正在使用视图文件中的API,如下所示:

class BooksPage(generic.TemplateView):
    def get(self,request):
        r = requests.get('http://api.example.com/books?author=edwards&year=2009')
        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编写了上面的示例,因此任何bug都纯粹是在这里编写的结果。

共有1个答案

陶锋
2023-03-14

我喜欢将这种逻辑放在单独的服务层(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包的功能)。

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,所以当我有一个当前的解决方案时,我不确定它是否遵循django中的最佳实践。我想在我的网站上显示来自Web api的信息。假设api网址如下: http://api.example.com/books?author=edwards&year=2009 Thsis将返回Edwards在2019年写的书籍清单。以以下格式返回: 目前,我正在如下视图中使用API​

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

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

  • 我试过、以及不同的导入(我想也许我没有使用singletons使用的正确的“NAT”或“Natural”),所有这些都给我带来了类似的错误。这里有什么问题?我必须为的类型编写singletons手动生成的定义吗?还是这里缺少了什么?

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

  • 我有一个问题,关于正确的方法,使插入我的实体+外键在数据库(Mysql,jpa)。在问我的问题之前,我尝试了我找到的解决方法,我花了几天时间自己解决这个问题。我好像有什么不对劲: 我需要做的是: 1。站点表中已经存在数据(信息) 2。我必须在序列表中插入新序列 3。我必须在序列表中插入新序列,并关联FK站点的(站点已存在,不需要再次插入) 主要问题是: 1。当我插入序列表时,我有正确插入站点FK的