4

クラスメソッドをFlaskで実行するのに問題があります。

models/User.py

from mongoengine import *

class User(Document):
  first_name = StringField()
  last_name = StringField()
  ...

  def __init__(self, arg1, arg2, ...):
    self.first_name = arg1
    self.last_name = arg2
    ...

  @classmethod
  def create(self, arg1, arg2, ...):
    #do some things like salting and hashing passwords...
    user = self(arg1, arg2, ...)
    user.save()
    return user

メインアプリケーションのPythonファイル:

from models import User
...
def func():
  ...

  #Throws "AttributeError: type object 'User' has no attribute 'create'"
  user = User.create(arg1, arg2, ...) 

Userオブジェクトをインスタンス化せずにUserクラスでcreateを呼び出すことはできませんか?Python 2.7.2を使用しており、デコレータ以外の構文を使用してみましcreate = classmethod(create)たが、機能しませんでした。前もって感謝します!

編集:1つの問題を見つけました:modelsフォルダーに__init__.pyファイルが含まれていなかったため、モジュールではなかったため、from models import User実際に必要なファイルをインポートしていませんでした。以前はアプリケーションのPythonスクリプトと同じディレクトリにモジュールがあったため、エラーは発生しませんでしたが、削除した後、対応するファイルmodels.pyを削除することはありませんでした。.pycこれで、以前のエラーではなくエラーが発生しますAttributeError: 'module' object has no attribute 'create'が、正しいファイルがインポートされていると確信しています。

EDIT2:解決しました。次に、インポートをに変更しましたfrom models.User import User。これでメソッドがヒットします。

4

2 に答える 2

3

問題は2つありました。

  1. User.pyファイルはフォルダー内にありました。つまり、インポートは実際にファイル内のクラスをmodels/探していました。このクラスは存在していませんが、ファイルがまだ存在しているため、エラーなしでインポートされていました。Usermodels.pymodels.pyc
  2. ディレクトリ内でインポートするには、インポートが正しくありませんでした。from models.User import Userフォルダがモジュールである限り、そうあるべきだったmodels/ので、私がする必要があるのは。だけでしたtouch models/__init__.py
于 2012-08-10T08:45:25.100 に答える
1
>>> class foo(object):
...     def __init__(self):
...             pass
...     @classmethod
...     def classmethod(cls):
...             return 0
...
>>> a = foo()
>>> a.classmethod()
0
>>>
于 2012-08-08T09:20:00.873 に答える