关于python:只使用Django的某些部分?

Use only some parts of Django?

我喜欢django,但对于一个特定的应用程序,我只想使用它的一部分,但我对django内部的工作方式还不够熟悉,所以也许有人可以向我指出正确的方向,让我了解我需要检查的内容。

具体来说,我想使用:

  • 模型和数据库抽象
  • 缓存API,虽然我希望通过缓存而不是HTML生成来避免数据库查找,而且由于Django中的缓存框架是为后者设计的,所以我还不确定这是否真正合适。
  • 小精灵

    我不会使用:

    • 模板化
    • URL配置
    • 小精灵

      或者,更确切地说,我既不使用HTTP也不使用HTML。所以基本上,我有一个不同的输入/输出链。

      这行吗?

      我在Django中的个人杀手特性是我可以用模型进行的对象/数据库映射,所以如果有另一种技术(不一定是python,我处于设计阶段,而且我对语言和平台很不了解)能给我同样的能力,那也太好了。


      我自己使用django进行对象/db映射,而不使用其urlconfigs。只需创建一个名为djangosettings.py的文件并插入必要的配置,例如:

      1
      2
      3
      4
      5
      DATABASE_ENGINE   = 'oracle'
      DATABASE_HOST     = 'localhost'
      DATABASE_NAME     = 'ORCL'
      DATABASE_USER     = 'scott'
      DATABASE_PASSWORD = 'tiger'

      然后在常规的python代码中,

      1
      2
      import os
      os.environ["DJANGO_SETTINGS_MODULE"] ="djangosettings"

      在导入任何Django模块之前。这将允许您使用django的对象/db映射,而实际上没有django项目,因此您可以将其用于独立脚本或其他Web应用程序或任何您想要的内容。

      至于缓存,如果您不想使用django,那么您应该决定使用什么,然后从那里开始。我建议使用Cherrypy,它不使用Django样式的正则表达式URL映射,而是根据函数名自动将URL映射到函数。在Cherrypy主页的顶部有一个例子:http://cherrypy.org/

      Cherrypy有自己的缓存系统,因此您可以完成与Django完全相同的工作,但不需要使用Django的urlconfig系统。


      Django是一个网络框架,在创建网站方面非常高效。然而,它也同样非常适合解决网络以外的问题。这就是项目引以为豪的松耦合。没有什么能阻止你安装一个完整版本的django,只使用你需要的。通常,很少有Django组件对它们的使用做出广泛的假设。

      明确地:

      • 姜戈模特什么都不知道关于HTML或HTTP。
      • 模板对HTML或HTTP一无所知。
      • 高速缓存系统可用于存储任何可以腌制的东西。
      • 小精灵

        在没有Web服务器的情况下使用Django时,您将面临的主要问题之一是正确地设置环境。仍然需要在settings.py中配置ORM和缓存系统。有些文档在使用Django时没有设置模块,您可能会发现这很有用。


        我已经创建了一个模板django项目,允许您这样做。

        网址:https://github.com/dancaron/django-orm

        只要按照说明操作,就可以编写使用Django数据库功能的独立python文件,而无需使用urlconf、视图等。


        与使用Python进行Web编程相比,我倾向于使用混合匹配方法。-)

        我对Django没有太多的经验,但是我建议给sqlacalchemy一个数据库方面的东西。它可以很好地与其他人一起工作,并为您提供几个潜在的抽象层(因此,如果您愿意,您可以使用一些基本的东西,或者对其进行一些修改)。另外,如果你曾经使用过hibernate/nhibernate,你已经对它有些熟悉了。

        我最喜欢的部分是它有很多数据库连接选项(最显著的是SQL Server,Django上次检查时没有内置它)。

        有人告诉我,使用Django,很容易将功能分离(但我自己从来没有这样做过)。


        当然,还有其他项目专门实现了Django的单个部分。例如,TurboGears是几个项目的集合,这些项目可以单独工作,并共同形成一个完整的Web开发框架。

        对于数据库抽象,我想到了SQLAlchemy。

        关于缓存部分:我不知道任何实现通用缓存功能的独立项目。

        另一方面,实现自己的缓存应该相当容易,例如使用pickles。看看这个点子装饰师和谷歌"memoize"的食谱。

        还要记住,您的数据库有自己的缓存机制,所以您甚至不需要关心细节。


        为了使用django的模型和数据库抽象,我在这里解释了一种在django之外使用它们的干净方法:https://stackoverflow.com/a/49515366/2682613

        Django 2.0.2版


        我找到了keyboardinterrupt的答案,但在2009年得到了答案,我没有在django 1.8中运行它。对于最近的Django 1.8,您可以看看这个,其中一些部分来自keyboardinterrupt的答案。

        文件夹结构为:

        1
        2
        3
        4
        5
        .
        ├── myApp
        │   ├── __init__.py
        │   └── models.py
        └── my_manage.py

        myapp是一个模块,包含一个空的__init__.pymodels.py

        models.py中有一个示例模型类:从django.db导入模型

        1
        2
        class MyModel(models.Model):
             field = models.CharField(max_length=255)

        my_manage.py包含django数据库、已安装的_app设置并充当django official manage.py,因此您可以:

        1
        2
        3
        python my_manage.py sql myApp
        python my_manage.py migrate
        ......

        my_manage.py中的代码为:从django.conf导入设置

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        db_conf = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'your_database_name',
                'USER': 'your_user_name',
                'PASSWORD': 'your_password',
                'HOST': 'your_mysql_server_host',
                'PORT': 'your_mysql_server_port',
            }
        }

        settings.configure(
            DATABASES = db_conf,
            INSTALLED_APPS     = ("myApp", )
        )

        # Calling django.setup() is required for"standalone" Django u usage
        # https://docs.djangoproject.com/en/1.8/topics/settings/#calling-django-setup-is-required-for-standalone-django-usage
        import django
        django.setup()

        if __name__ == '__main__':
            import sys
            from django.core.management import execute_from_command_line

            execute_from_command_line(sys.argv)


        我分享了一个解决方案的例子,它可以防止代码中的python路径操作:

        https://github.com/askalyuk/django-orm-独立

        它包含一个独立的数据访问包、一个单独的简单Django站点和一个单元测试。