2012-05-02 44 views
18

Tôi có ứng dụng Django hiện có với cơ sở dữ liệu và tệp models.py tương ứng.Làm thế nào tôi có thể sử dụng ORM Django trong ứng dụng Tornado của tôi?

Tôi có một ứng dụng Tornado mới cung cấp dịch vụ web cho các ứng dụng khác. Nó cần phải đọc/ghi từ cùng một cơ sở dữ liệu, và có mã trong các mô hình tập tin tôi muốn sử dụng.

Làm cách nào để sử dụng tốt nhất cơ sở dữ liệu và mô hình Django trong trình xử lý yêu cầu Tornado của tôi? Nó đơn giản như tạo một liên kết tượng trưng đến thư mục dự án models.py Django, nhập mô-đun Django và sử dụng nó? Tôi đoán tôi phải làm settings.configure(), phải không?

Cảm ơn!

+2

Bạn có thể sử dụng thiết lập django bạn như là một api và làm yêu cầu http không đồng bộ với nó. Sau đó bạn sẽ không phải lo lắng về việc chuyển mã sang lốc xoáy. – dm03514

+1

Không sử dụng django ORM bị chặn trong cơn lốc xoáy? Tôi không chắc chắn nếu đó là trường hợp, cái nhìn sâu sắc hơn bởi một người nào đó sẽ được đánh giá cao. – tapan

+0

Django ORM chắc chắn đang chặn. –

Trả lời

12

Thêm đường dẫn đến dự án Django vào PYTHONPATH của ứng dụng Tornado env-var và đặt DJANGO_SETTINGS_MODULE phù hợp. Sau đó bạn có thể nhập các mô hình của bạn và sử dụng sau đó như bình thường với Django chăm sóc thiết lập ban đầu vào lần nhập đầu tiên.

Bạn không nên yêu cầu bất kỳ liên kết tượng trưng nào.

17

có một ví dụ here về cách sử dụng django ORM và dạng django bên trong Tornado. và bạn có thể đọc Using Django Inside the Tornado Web Server để biết một số thông tin. đoạn mã sau đã đưa ra từ đó:

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() 

và đây là một demo với django và cơn lốc xoáy ...

+0

nếu tôi muốn sử dụng lớp Model trong django và lốc xoáy cùng một lúc? –

3

tôi không thể có được nó để làm việc với các thông tin được cung cấp bởi @aragon trong Django 1.8. Kể từ khi câu hỏi này là một trong những kết quả đầu tiên trong Google khi tìm kiếm Django + Tornado hội nhập, đây là cách tôi đã nhận nó làm việc trong 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() 
Các vấn đề liên quan