簡體   English   中英

Django-使用call_command從視圖調用的腳本連接到Pyro服務器腳本,但在模型訪問時凍結

[英]Django - Script called from view with call_command connects to Pyro server script but freezes on model access

案件:

我已經運行了Django應用程序,並獲得了一個包含帳戶及其狀態列表的界面。 在界面中,我可以選擇單擊一個按鈕來啟動一個帳戶。

這將調用名為“ start_session”的視圖,該視圖將通過django.core.management.base中的call_command函數啟動腳本,並將帳戶的主鍵作為參數。 這是一個Pyro客戶端腳本,它將向運行中的Pyro服務器腳本發送命令以啟動帳戶(目前,它只是將狀態從“關閉”更改為“開啟”,但最終可能是必須運行並做幾個小時)。

問題:

當我嘗試獲取與給定主鍵匹配的Account模型的實例並嘗試更改狀態,甚至嘗試將帳戶狀態返回給Pyro客戶端時,它將凍結。 請注意,如果我只是返回帳戶狀態,它只會凍結,直到用CTRL-C中斷Pyro服務器腳本,然后Pyro客戶端腳本會打印出帳戶狀態。 但是更改帳戶狀態從來沒有奏效。

任何幫助或建議,不勝感激!

碼:

views.py

from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required
from django.core.management import call_command

@login_required
def start_session(request, account_pk):
    call_command('pyro_client', account_pk)
    return redirect('/control_panel')

pyro_client.py

import Pyro.core
from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):
    def add_arguments(self, parser):
        # Positional arguments
        parser.add_argument('account_pk', nargs='+', type=str)        

    def handle(self, *args, **options):
        for account_pk in options['account_pk']:
            pyro_server = Pyro.core.getProxyForURI("PYRO://192.168.1.7:7766/c0a8010723ac22123332ff93e89e5328")
            pyro_server.command(account_pk, 'start')

pyro_server.py

import Pyro.core
from flipper.models import Account as AccountModel
import traceback

class PyroServer(Pyro.core.ObjBase):
    def __init__(self):
        Pyro.core.ObjBase.__init__(self)

    def command(self, account_pk, command_value):
        try:                
            if command_value == 'start':
                self.start_account(account_pk)

        except Exception, e:
            return traceback.format_exc()

    def start_account(self, account_pk):
        account = AccountModel.objects.get(pk=account_pk)

        account.state = 'ON'
        account.save()          

Pyro.core.initServer()
daemon=Pyro.core.Daemon()
uri=daemon.connect(PyroServer(),"pyro_server")

print "The daemon runs on port:",daemon.port
print "The object's uri is:",uri

daemon.requestLoop()

您正在鏈接到Pyro4庫的文檔,但是您的代碼使用的是古老且不再受支持的Pyro庫版本3! 通過使用當前版本的Pyro4(撰寫本文時為4.45),許多問題都會消失,包括希望解決“凍結”問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM