【问题标题】:Creating a django rest API for my python script为我的 python 脚本创建一个 django rest API
【发布时间】:2015-02-23 19:39:03
【问题描述】:

我有一个 JSON 文件,其中包含这样的数据:

['dbname' : 'A', 'collection' : 'ACollection', 'fields' : ['name', 'phone_no', 'address']}
['dbname' : 'B', 'collection' : 'BCollection', 'fields' : ['name', 'phone_no', 'address', 'class']}

这些是相同格式的许多其他词典中的 2 个示例。

我有一个执行以下操作的 python 代码:接受来自用户的 2 个输入 - phone_no 和 dbname。例如,用户输入 phone_no 为 xxxxxxxxxx,dbname 为 A。python 代码然后读取 JSON 文件并将用户输入与数据库名称为“A”的字典元素匹配。然后它打开数据库“A”,打开相应的集合“ACollection”并打印集合中phone_no 值为xxxxxxxxxx 的帖子的相应字段。数据库是用 mongoDB 实现的。

我需要为此代码构建一个 django rest api。最终目标是从浏览器访问代码。用户在浏览器中提供 2 个输入并执行代码,返回显示在浏览器上的数据。我已经阅读了 django-rest 框架文档,但我对整个概念还是陌生的,需要一些指导。

如何实现这些功能并创建 API?模型、序列化程序、视图和 urls 文件应该与我的程序相关的代码是什么?

models.py

from django.db import models


class App(object):
        def __init__(self, phone_no, name, address, categories):
                self.phone_no = phone_no
                self.name = name
                self.address = address
                self.categories = categories

这是我目前正在使用的,开始。然而,问题在于模型类本质上应该是动态的。例如:如果 'A' 是数据库,程序返回 3 个字段,但如果 'B' 是数据库,程序返回 4 个值,所以我不确定模型类会是什么样子。

views.py

from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
from rest_framework.response import Response
from pymongo import Connection
from models import App
from serializers import AppSerializer
import json
import pymongo
from os import listdir
import re
from django import forms


@csrf_exempt
@api_view(['GET'])
def pgs(request):
    #connect to our local mongodb
    db = Connection('localhost',27017)
    #get a connection to our database
    dbconn = db.general
    dbCollection = dbconn['data']

    if request.method == 'GET':
        #get our collection
        items = []
        for r in dbCollection.find():
            post = App(r["phone_no"],r["name"],r["address"],r["categories"])
            items.append(post)
        serializedList = AppSerializer(items, many=True)
        return Response(serializedList.data)

【问题讨论】:

  • 你有数据模型的初始代码吗?这可能是一个很好的起点,可以解决一些更具体的问题。
  • 到目前为止,我已经设置了一个基本的 API,它只是从数据库中检索数据并显示它。我试图弄清楚如何在浏览器中从用户那里获取 phone_no 输入并使用它来查询数据库中的帖子
  • 太棒了。如果您有数据库,那么您至少已经开始使用数据模型。您是否有为此的 Django 模型类,或者它仍然只是一个 db 模式?不管怎样,让我们​​先来看看吧。
  • 我已经添加了 models.py 类
  • 太棒了。现在,当您说“数据库”时,您实际上是指不同的数据库连接,还是只是同一个数据库中的不同来源?

标签: python django mongodb rest django-rest-framework


【解决方案1】:

假设您在两个不同的数据库中有相同的表。我们首先在 settings.py 中创建两个数据库连接。假设它们被称为 db_a 和 db_b。我们可以这样建模:

class PhoneGenome(models.Model):
    phone_no = models.CharField(length=255)
    name = models.CharField(length=255)
    # and so on...
    class Meta:
        # if database pre-exists, may want to use managed=False
        managed = False

这给了我们一个模型。现在我们根据用户输入选择从哪个数据库中提取。在一个视图中,你可能有这样的东西:

db_used = request.GET.get('database')
db_conns = {'a': 'db_a', 'b': 'db_b'}
if db_conns.has_key(db_used):    
    records = PhoneGenome.objects.using(db_conns[db_used]).filter( user_criteria_here)

查询集中的 using() 方法允许您选择要针对哪个数据库运行查询。

这里可能有很多事情需要管理,所以现在是查看文档的好时机:https://docs.djangoproject.com/en/1.7/topics/db/multi-db/

如果您还没有,那么您真的应该至少完成 Django 教程,然后再继续学习。

【讨论】:

  • 难点在于,每个数据库没有完全相同的表,有的有3个字段,有的多达10个。还有10多个数据库具有内置的添加新数据库的功能,所以手动为每个数据库创建模型是没有意义的。另外,我刚刚将 db_used = request.GET.get('database') 添加到我现有的 views.py 文件中,但在浏览器中没有提示用户输入
  • 很公平。我想你可能会发现 Django 是错误的工具。仅构建一个 JSON 接口就需要很多开销……尤其是如果您甚至不打算使用内置模型。相反,我会使用 Flask 来为您的视图提供服务,并依靠更编程的方式来访问您的数据,例如 SQL Alchemy。
猜你喜欢
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多