0

複数のチームが解析されるコンテンツをアップロードするDjangoアプリがあります。アプリは、解析されたコンテンツの特定の一般的な情報を追跡します。ここでの問題は、コンテンツが異なる形式であるため、各チームに異なるパーサーで解析する必要のあるコンテンツがあることです(たとえば、一部のチームにはXMLコンテンツ、一部にはテキスト、一部にはJSONなどがあります)。各チームは、解析後に対応するDjangoモデルに配置される必要な情報を取得するパーサー(Pythonモジュール)を提供しています。

私の質問は、各チームが独自のパーサーを正しくセットアップできるDjangoでこれを設計するための最良の方法は何ですか?純粋にバックエンドにすることができ、ユーザーフォームなどは必要ありません。私の最初の考えは、次のParserように各チームにForeignKeyを使用してモデルを作成することでした。

class Parser(models.Model):
    team = models.ForeignKey('Team')
    module_path = models.CharField(max_length=..., blank=False)

module_pathこれは「parsers.teamA.XMLparser」のようなもので、次のようにそのパスのアプリコードに存在します。

parsers/
    teamA/
        __init__.py
        XMLparser.py
    teamB/

次に、アップロードされたコンテンツをアプリが解析するようになると、次のようになります。

team = Team.objects.get(id=team_id)
parser = Parser.objects.get(team=team)

theParser = __import__(parser.module_path)
theParser.parse(theStuffToBeParsed)

誰もがこれに関してどのような問題を見ていますか?私が考えることができる他の唯一のオプションは、パーサーごとに個別のDjangoアプリを作成することですが、どのチームがデータベース内のどのアプリを使用しているかをどのように参照しますか(ここで行ったのと同じですか?)?

4

1 に答える 1

1

あなたが取っているアプローチは私には有効なようです。あなたは効果的に任意のPythonコードを実行しているので、私が公開サイトでこのようなものを使用することは決してなく、パーサーを作成するチームを信頼することを忘れないでください。

モジュールパスを表すカスタムフィールドを記述して、毎回インポートを処理する必要をなくし、代わりにインポートを処理して解析メソッドを返すことで、これを少し改善することができます(または、パーサーオブジェクトの方が良いかもしれません。チームにインターフェースを実装するように指示できます)

最良の例は、djangoのImageFieldまたはCharFieldのソースを調べることです。モデルにCharFieldを設定する代わりに、「ModuleField」を作成しますparser = ModuleField()。データベースに格納された値は、実際にはモジュールへのパスになります(したがって、単にCharFieldのサブクラスにします)が、to_pythonメソッドをオーバーライドします。新しいto_pythonメソッドで、モジュールのインポートを処理し、pythonオブジェクトを返します。

そのpythonオブジェクトは、あなたが望むものなら何でもかまいません。あなたの例から、あなたはそうすることができreturn theParser.parseます。これにより、パーサーインスタンスがある場合は次のようになりますfoothe_parser_method = foo.parser

于 2012-04-03T18:30:52.787 に答える