์๋ ํ์ธ์,
๋ด tastypie๋ฅผ 13.3์์ ํค๋๋ก ์ ๋ฐ์ดํธํ์ ๋ ์น ์ฑ์ ์คํํ๋ ค๊ณ ํ๋ฉด ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Request Method: GET
Request URL: http://192.168.0.104:8888/accounts/login/?next=/dashboard/
Django Version: 1.8.8
Python Version: 2.7.12
Installed Applications:
('longerusernameandemail',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tastypie',
'myapp',
'widget_tweaks',
'corsheaders')
Installed Middleware:
('corsheaders.middleware.CorsMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
119. resolver_match = resolver.resolve(request.path_info)
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
365. for pattern in self.url_patterns:
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns
401. patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module
395. self._urlconf_module = import_module(self.urlconf_name)
File "/home/user/anaconda2/lib/python2.7/importlib/__init__.py" in import_module
37. __import__(name)
File "/home/user/webserver/myapp/urls.py" in <module>
7. from myapp.api import UserResource
File "/home/user/webserver/myapp/api.py" in <module>
303. class MyResource(ModelResource):
File "/home/user/anaconda2/lib/python2.7/site-packages/tastypie/resources.py" in __new__
1797. if meta and meta.object_class:
Exception Type: AttributeError at /accounts/login/
Exception Value: class Meta has no attribute 'object_class'
๋ฒ์ 13.3์ผ๋ก ๋ค์ ์ ํํ๋ฉด(a71dd6e85e18ec38e978e904c0c7a91dee11043d ์ปค๋ฐ) ์ ๋๋ก ์๋ํฉ๋๋ค.
๋ฌด์์ด ์๋ชป๋์์ ์ ์์ต๋๊น?
๊ฐ์ฌ ํด์
๋ฆฌ์์ค๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น?
๋ด urls.py์์ tastypie.api.Api
๋ฅผ ๊ฐ์ ธ์จ ๋ค์ ๋ฆฌ์์ค๋ฅผ ํ๋์ฉ ๊ฐ์ ธ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋ ค๊ณ ํ์๋ง์ ์คํจํ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๊ฒ์ ๋ฆฌ์์ค ์ค ํ๋์ด์ง๋ง ์ด๊ฒ์ ์ฃผ์ ์ฒ๋ฆฌํด๋ ๋ค์ ๋ฆฌ์์ค์์ ์ถฉ๋ํฉ๋๋ค.
class MyResource(ModelResource):
class Meta:
queryset = MyModel.objects.all()
fields = ['my_field']
allowed_methods = ['get']
resource_name = 'my_resource'
authentication = BasicAuthentication()
include_resource_uri = False
๋ฐฉ๊ธ ํ๊ท ํ ์คํธ๋ฅผ ์ถ๊ฐํ์ง๋ง ์ค๋ฅ๋ฅผ ์ฌํํ์ง ๋ชปํ์ต๋๋ค. 3e1f5527b698c7121d4c5434d073b08d364d31f2
๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์ฝ๋ ์ํ์ด ์ค์ ์ฝ๋์ ์ผ๋ง๋ ๊ฐ๊น์ต๋๊น?
์ด์ ๋ํด ์กฐ์ฌํ Sean์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ํ ์ฝ๋๋ ๋งค์ฐ ์ ์ฌํ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฆ๋ง ๋ณ๊ฒฝํ์ต๋๋ค. ๋๋ ๋ด ๋์์ ๋ค์ ํ์ธํ๊ณ ๊ด๋ จ์ฑ์ด ์๊ณ ๋๋ฝ ๋ ์์๊ฐ ์๋์ง ํ์ธํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
๋ง๋ฌด๋ฆฌ, ๋ ์์ธํ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ธ์ ๋ ์ง ๋๊ธ์ ๋จ๊ฒจ์ฃผ์ธ์.
@SeanHayes : ์ถ์ ๊ธฐ๋ณธ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ค์์ ์ฌ์์ฐ์ ๋๋ค.
class BaseResource(ModelResource):
class Meta:
authentication = DefaultAuthentication()
class FooResource(BaseResource):
class Meta(BaseResource.Meta):
resource_name = 'foo'
queryset = Foo.objects.all()
class BarResource(BaseResource):
class Meta(BaseResource.Meta):
resource_name = 'bar'
queryset = Bar.objects.all()
BaseResource์ ์ฟผ๋ฆฌ ์ธํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ class BaseResource(ModelResource):
ํ์ hashhemian์ด ๋ถ์ฌ๋ฃ์ ๋์ผํ ์คํ ์ถ์ ์ผ๋ก ์คํจํฉ๋๋ค.
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ object_class = None
๋ฅผ BaseResource.Meta
์ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค.
์ค์ ์์ ์ฌํญ์ resources.py ํ 1797์ if meta and getattr(meta, 'object_class'):
... ๋๋ ์ฟผ๋ฆฌ ์ธํธ๊ฐ ์ค์ ๋์ง ์์์ ๋ ModelResource ํ์ ํด๋์ค๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ๋ฐ๋์งํ ๊ฒฝ์ฐ ํด๋น ์ค๋ฅ๊ฐ ๋ ๋ช ์์ ์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ด BaseResource๊ฐ ์คํจํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ ์ดํ๋ก ์ฌ๊ธฐ์์ ํ๋ ค๋ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ฐ์ฌ ํด์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@SeanHayes : ์ถ์ ๊ธฐ๋ณธ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ฐฉ๊ธ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ค์์ ์ฌ์์ฐ์ ๋๋ค.
BaseResource์ ์ฟผ๋ฆฌ ์ธํธ๊ฐ ์๊ธฐ ๋๋ฌธ์
class BaseResource(ModelResource):
ํ์ hashhemian์ด ๋ถ์ฌ๋ฃ์ ๋์ผํ ์คํ ์ถ์ ์ผ๋ก ์คํจํฉ๋๋ค.ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์
object_class = None
๋ฅผBaseResource.Meta
์ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค.์ค์ ์์ ์ฌํญ์ resources.py ํ 1797์
if meta and getattr(meta, 'object_class'):
... ๋๋ ์ฟผ๋ฆฌ ์ธํธ๊ฐ ์ค์ ๋์ง ์์์ ๋ ModelResource ํ์ ํด๋์ค๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ๋ฐ๋์งํ ๊ฒฝ์ฐ ํด๋น ์ค๋ฅ๊ฐ ๋ ๋ช ์์ ์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ด BaseResource๊ฐ ์คํจํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ ์ดํ๋ก ์ฌ๊ธฐ์์ ํ๋ ค๋ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ฐ์ฌ ํด์!