6

我正在学习使用 Ruby on Rails 和 python 的 EdX 课程。这让我有勇气尝试使用 Apache、mod_wsgi 和 PostgreSQL 安装和学习 Django。按照详细的安装说明,我首先安装了 Apache,然后是 mod_wsgi,然后是 PostgreSQL。我从源代码安装了每一个,并对每一个都进行了一些教程,并确保它们已正确安装。我有一个 postgres 用户设置来运行 PostgreSQL 服务器,我能够为自己创建一个用户“角色”以及一个我的角色继承的管理员角色,可以创建一个数据库等。我尝试了一些 SQL psql 按照教程制作表格等。我知道如何为给定角色授予权限。

所以无论如何,我非常接近从源代码实际安装 Django 的步骤,但我不确定如何遵循安装说明中的建议:

如果您计划使用 Django 的 manage.py syncdb 命令为您的模型自动创建数据库表,您需要确保 Django 有权在您正在使用的数据库中创建和更改表;如果您计划手动创建表,您可以简单地授予 Django SELECT、INSERT、UPDATE 和 DELETE 权限。

也许在我按照实际安装 Django 的步骤并阅读了一些教程之后,我会确切地了解在 PostgreSQL 中需要设置什么来授予 Django 这些权限,但是如果我按顺序按照安装说明进行操作,它似乎是在说我现在应该在安装 Django 之前设置这些权限。如果我能在安装 Django 之前让有人告诉我怎么做,我将不胜感激。

4

3 回答 3

9

settings.pydjango 项目的文件中,有一段代码如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproj_db',
        'USER': 'myproj_user',
        'PASSWORD': '123',
        'HOST': '',
        'PORT': '',
    },
}

它的作用是告诉 Django 哪个用户(在这种情况下为 postgres 用户)和数据库与您的 django 项目一起使用。

通常,您需要将其myproj_usermyproj_db.

创建此用户时,您可以选择为其授予权限,如下所示:

CREATE USER myproj_user WITH PASSWORD '123' SUPERUSER CREATEDB CREATEROLE LOGIN;

这将创建myproj_user具有超级用户,createdbm createrole,允许用户登录的权限。

然后数据库像这样:

CREATE DATABASE myproj_db WITH OWNER myproj_user TEMPLATE=template1 ENCODING='utf-8';

于 2012-11-12T06:38:46.603 回答
0

您说您知道如何为给定角色授予权限,这是您在安装 Django 之前需要为它做的事情(运行 syncdb)。

这是设置您的数据库以与 Django 一起使用的一部分——您在创建每个 Django 项目之前采取的步骤。每个 Django 项目对应于您使用 Django 构建的站点,并且与另一个 Django 项目完全分离。每个项目都属于一个数据库。* 您可以在设置数据库之前安装 Django 框架,因为 Django 框架本身不会做任何事情。

要么您授予 Django 为您创建表的权限,在这种情况下,它可以为您创建表(使用manage.py syncdb)。或者,您使用manage.py sqlall <app>自己运行的 SQL 来创建所需的表(如果您对安全性感到偏执,这可能会很好)。

要在 Postgres 中向用户授予特定数据库(选项 1)的所有权限,请使用命令(来自psql):

GRANT ALL PRIVILEGES ON DATABASE <db-name> TO <username>;

* 从技术上讲,他们可以通过简单地配置他们使用同一个数据库来共享一个数据库。

于 2012-11-12T02:38:57.407 回答
0

Django 使用 ORM(对象关系映射器)。这意味着您不直接处理用于查询事物的数据库表,而是处理某些然后处理数据库的类。与手动执行 SQL 相比,这非常有用且对用户更友好。考虑以下示例:

SELECT * FROM foo WHERE field="value"

对比

Foo.objects.filter(field='value')

在 ORM 中,您通过创建某些类(在 Django 中我们称之为模型)来描述您拥有的表,这些模型对应于 db 中的表,它们的字段对应于 db 表中的列。以下内容非常相似:

CREATE TABLE foo (
    title        varchar(50),
    description  text,
    likes        integer
);

class Foo(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField()
    likes = models.IntegerField()

然而,作为开发人员,构建用于创建表的 SQL 语句并将 Python 中的这些表描述为模型是浪费时间。不这样做,Django 允许您在定义所有模型后为您创建数据库表。这就是syncdb命令的目的。它获取其中所有已安装的应用程序和模型,并在您的数据库中为它们创建表。但是,正如您在问题中已经提到的那样,数据库具有角色并且这些角色具有权限。例如,其中一项权限如此CREATE所述. 因此,Django 文档所说的是让您授予 Django 用于与数据库交互的角色的所有必要权限,以便 Django 能够创建它需要的必要数据库表,并可能在以后修改它们。

于 2012-11-12T02:41:39.177 回答