Вопрос по python – Как я могу использовать Django ORM в своем приложении Tornado?

21

У меня есть приложение Django с базой данных и соответствующимmodels.py файл.

У меня есть новое приложение Tornado, которое предоставляет веб-сервис другим приложениям. Он должен читать / писать из той же базы данных, и в файле моделей есть код, который я хотел бы использовать.

Как мне лучше всего использовать базу данных и модели Django в моих обработчиках запросов Tornado? Это так же просто, как сделать символическую ссылку наmodels.py Папка проекта Django, импорт модулей Django и их использование? Я думаю, что я должен сделатьsettings.configure(), право?

Спасибо!

Django ORM определенно блокирует. Cole Maclean
Не будет ли использование django ORM блокировать торнадо? Я не уверен, что в этом случае, кто-то оценил бы более глубокое понимание. tapan
Я только что подумал о возможном способе обойти блокирующую природу Джанго. Наборы запросов Django ленивы (они не попадают в базу данных, пока вы не скажете так). Поэтому, если вы выполните запрос raw = Model.objects.all ()., Вы получите необработанный запрос SQL, который вы можете передать в асинхронный драйвер db вашего торнадо. Я ошибаюсь? hymloth
Вы можете использовать настройки django в качестве API и делать асинхронные http-запросы к нему. Тогда вам не придется беспокоиться о переносе кода в торнадо. dm03514

Ваш Ответ

3   ответа
12

Добавить путь к проекту Django в PYTHONPATH env-var приложения Tornado и соответствующим образом установить DJANGO_SETTINGS_MODULE. После этого вы сможете импортировать свои модели и использовать их тогда, как обычно, с Django, заботясь о начальной настройке при первом импорте.

Вы не должны требовать каких-либо символических ссылок.

4

Я не мог заставить его работать с информацией, предоставленной @aragon в Django 1.8. Так как этот вопрос является одним из лучших результатов в Google при поиске интеграции Django + Tornado, вот как я заставил его работатьin Django 1.8:

from django import forms
from django.db import models

from models import Operation #Own model
import django

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': 'database.db',
    }
}
settings.configure(DATABASES=DATABASES)

if django.VERSION[:2] > (1,5):
    django.setup()
18

есть примерВот о том, как использовать Django ORM и форму Django внутри Tornado. и ты можешь читатьИспользование Django внутри веб-сервера Tornado для некоторой информации. следующий код взят оттуда:

import sys
import os

import tornado.httpserver
import tornado.ioloop
import tornado.web

# django settings must be called before importing models
from django.conf import settings
settings.configure(DATABASE_ENGINE='sqlite3', DATABASE_NAME='dev.db')

from django import forms
from django.db import models

# Define your Model
class Message(models.Model):
    """
    A Django model class.
    In order to use it you will need to create the database manually.

    sqlite> CREATE TABLE message (id integer primary key, subject varchar(30), content varchar(250));
    sqlite> insert into message values(1, 'subject', 'cool stuff');
    sqlite> SELECT * from message;
    """

    subject = models.CharField(max_length=30)
    content = models.TextField(max_length=250)
    class Meta:
        app_label = 'dj'
        db_table = 'message'
    def __unicode__(self):
        return self.subject + "--" + self.content

# Define your Form
class DjForm(forms.Form):
    subject = forms.CharField(max_length=100, required=True)
    content = forms.CharField()

# Define the class that will respond to the URL
class ListMessagesHandler(tornado.web.RequestHandler):
    def get(self):
        messages = Message.objects.all()
        self.render("templates/index.html", title="My title",
                    messages=messages)

class FormHandler(tornado.web.RequestHandler):
    def get(self):
        form = DjForm()
        self.render("templates/form.html", title="My title", form=form)

    def post(self):
        data = {
            'subject':self.request.arguments['subject'][0],
            'content':self.request.arguments['content'][0],
        }
        form = DjForm(data=data)
        if form.is_valid():
            message = Message(**form.cleaned_data)
            message.save()
            self.redirect('/')
        else:
            self.render("templates/form.html", title="My title", form=form)

# map the Urls to the class          
application = tornado.web.Application([
    (r"/", ListMessagesHandler),
    (r"/form/", FormHandler),
])

# Start the server
if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

а это другоедемонстрация с джанго и торнадо ...

если я хочу использовать класс Model в Django и Tornado одновременно?

Похожие вопросы