6
from django.db import models
import os
from django.db.models.signals import post_save
import sys

class Form(models.Model):
    site = models.CharField(max_length=50)
    num = models.CharField(max_length=10)
    octet = models.CharField(max_length=30)

    def __unicode__(self):
        return self.site
        return self.num
        return self.octet

def create_conf(sender, **kwargs):
    os.system("/usr/local/build " + self.site + ' ' + self.num + ' ' + self.octet)

post_save.connect(create_conf, sender=Form)

私のdjango Webアプリに引数付きのpythonコマンドラインアプリケーションを実行させようとしています. これがそれを回避するための最良の方法であるかどうかわかりませんか? アドバイスがない場合は、素晴らしいでしょう。Web フォームを介してユーザーから入力を取得し、それを引数として使用して cmd アプリケーションを実行しようとしています。

ヘルプは素晴らしいだろう

ありがとうウィリアム

4

3 に答える 3

4

save()これは、各オブジェクトでコマンドを実行する場合に適しているようです。

ただし、入力をサニタイズする必要があります。ユーザーが特殊文字 ( ,;または&たとえば) を設定すると、コマンドが壊れてシステムに危険が生じる可能性があります (たとえば、&& rm -rf /*オクテット内の a はここで楽しい可能性があります:p)。パラメータを保護するために使用するこの回答を確認する必要があります。Popen

from subprocess import Popen  

def create_conf(sender, instance, **kwargs):
     p1 = Popen(["/usr/local/build", instance.site, instance.num, instance.octet])

ドキュメント に従って、インスタンスを取得する関数宣言も修正します。

別のこと: あなたの__unicode__関数は正しくありません。このような 3 つの値を返すことはできません。

class Form(models.Model):
    site = models.CharField(max_length=50)
    num = models.CharField(max_length=10)
    octet = models.CharField(max_length=30)

    def __unicode__(self):
        return "%s %s %s" % (self.site, self.num, self.octet)
于 2013-09-16T07:47:25.967 に答える
3

このコードが機能しない理由は別の回答で説明されています。次回このようなことが起こったときに備えて、彼の質問に答えているだけです。

これが機能しない理由をデバッグする方法についてアドバイスをお願いします。

def create_conf(sender, **kwargs):
    import pdb
    pdb.set_trace()
    os.system("/usr/local/build " + self.site + ' ' + self.num + ' ' + self.octet)

これにより、runserver が実行されているコンソールに組み込みの Python デバッガーが表示されます。これを使用すると、コードを段階的に調べて、通常の Python コマンド (print など) を実行できます。

デバッガー内のコマンドについては、こちらを参照してください。 一部の IDE には Python デバッグ サポートが付属しており、優れた GUI が表示されます。

頻繁に使用する場合: oneliner を使用します。

import pdb; pdb.set_trace;  # yes, Python supports semicolons 
                            # (although its not recommended)

そして、文字列がdjango Webページからcmdアプリケーションの引数に渡されるようにします。

次のいずれかを実行できます。

それらを文字列にキャストして確認します

os.system("/usr/local/build " + str(self.site) + ' ' + str(self.num) + ' ' + str(self.octet))

または、文字列フォーマッタを使用します (これは + 記号を使用するよりも優れており、入力が文字列にキャストされるようにします)

os.system("usr/local/build {0} {1} {2}".format(self.site, self.num, self.octet))

string .format メソッドについてはこちらをご覧ください

于 2013-09-20T21:33:51.847 に答える