【问题标题】:Remote access of django modelsdjango模型的远程访问
【发布时间】:2013-03-13 15:35:22
【问题描述】:

我有一个 django 1.5 项目,它使用 django 模型而不是在 apache 服务器上运行的 mysql。

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    birthdate = models.DateField()

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.ForeignKey(Person)

我还有一个 python/django 应用程序(使用 django 自定义命令)在必须使用这些模型的远程计算机上运行。

  • 远程应用程序与服务器共享相同的模型定义
  • 远程应用程序需要对模型进行只读访问
  • 远程应用程序不能完整转储服务器数据库,因为服务器必须根据用户权限返回查询集
  • 远程应用程序只能通过 http 连接到服务器
  • 服务器可以通过 REST API (json) 公开模型

是否有任何自动方式通过 http 传输模型?我曾尝试使用 django.core.serializers 但遇到以下问题:

  • 我无法序列化查询集中的相关对象
  • 没有本地数据库,远程应用程序无法工作
  • 远程应用程序在反序列化后搜索本地数据库上的相关对象(不存在)

编辑:

我设法像这样序列化模型:

books = Book.objects.prefetch_related('author').all()
authors = [book.author for book in books]
data = authors + list(books.all())
serialized_data = django.core.serializers.serialize("json", data)

我的问题是远程应用程序在没有本地数据库的情况下无法反序列化。

【问题讨论】:

  • 为什么需要没有数据库的模型?这没有任何意义。只需创建 REST API,以便服务器将对远程应用程序进行查询。为什么不能只将文件复制到远程应用程序?听说过存储库吗?
  • 远程计算机是否知道模型的结构?如果是这样,您可以序列化模型中的 *fields 等并传递它们。
  • 远程应用知道模型结构

标签: python django django-models


【解决方案1】:

不要认为您需要通过 http 传输模型。 只需要连接到服务器数据库。 在远程应用程序设置中选择数据库引擎(在您的情况下为 mysql),名称。 指定适当的用户和密码。 并输入有效的主机和代理(如果需要)。您的数据库服务器正在运行的那个

对于用户。在服务器上创建一个对数据库具有只读权限的 mysql 用户。

这将使您能够为服务器和远程应用程序使用相同的数据库。

【讨论】:

  • 应用程序对服务器的唯一访问权限(由于策略问题)是通过 http。事实上,我想为服务器上的模型设置值,远程应用程序应该能够读取它们(不是全部,而是过滤)并根据模型值执行某些操作。我需要模型的 http 代理之类的东西
  • 请允许我将您重定向到 REST API 库。如果是 Django 项目,我可以向您推荐这个:django-rest-framework.org 还有其他几个库,但我只对我提到的那个有经验,我喜欢它。
【解决方案2】:

最后我通过在客户端的 ram 上运行 sqlite 解决了

在settings.py上我使用了这个配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:'
    }
}

而代码是这样的:

from django.db import connections
from django.core.management.color import no_style
from django.core import serializers
from apps.my_models import Book, Person

connection = connections['default']
cursor = connection.cursor()

sql, references = connection.creation.sql_create_model(Book, no_style(), set())
cursor.execute(sql[0])
sql, references = connection.creation.sql_create_model(Person, no_style(), set())
cursor.execute(sql[0])

serialized_data = get_serialized_data()
for obj in serializers.deserialize("json", serialized_data):
    obj.save()
books = Book.objects.prefetch_related('author').all()

【讨论】:

  • 这是如何连接到远程服务器的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多