λ΄κ° μ¬κΈ°μνλ μΌμ΄ μλμ μ΄κ±°λ μμ ν μλͺ»ν κ²½μ° μ¬κ³Όνμ§λ§ prepend_urlsλ₯Ό μ¬μ©νμ¬ μ€μ²© λ 리μμ€λ₯Ό λ§λλ κ²μ λΆλͺ¨ λ° μμ 리μμ€ λͺ¨λμ λν μΈμ¦μ μ°ννλ€κ³ μκ°ν©λλ€. μ λ Cookbookμμμ μ μ¬ν μμ λ₯Ό λ§λ€κ³ ApiKey μΈμ¦μ μ¬μ©νμ¬ μμ 리μμ€λ₯Ό λ§λ€μμΌλ©° μ¬λ°λ₯Έ ν€λλ₯Ό μ λ¬νμ§ μμλ μ‘μΈμ€ ν μ μμ΅λλ€. μμ 리μμ€μλ ApiKey μΈμ¦λ νμν©λλ€.
μΈμ¦ ν€λμμ΄ λ΄κ° 보λ κ²μ λ€μκ³Ό κ°μ΅λλ€.
GET / api / v1 / article-μμλλ‘ 401
GET / api / v1 / article / 1 /-μμλλ‘ 401
GET / api / v1 / article / 1 / tags-νκ·Έ λͺ©λ‘μ΄ μκΈ°μΉ μκ² λ°νλ©λλ€.
λμκ² μ΄κ²μ λΆμ ννκ³ νμ€ν λ΄κ° κΈ°λνλ κ²κ³Όλ λ€λ₯Έ κ² κ°μ΅λλ€.
λ΄ κ²½νμ override_urls ν¨μ λ§ μ¬μ©νκ³ μμ λ§μ λμ€ν¨μΉ μμ λ©μλλ₯Ό λ§λλ κ²μ΄ ν¨μ¬ μ½κ³ μ°μν©λλ€. μ½λκ° μ κ³ λͺ¨λ νμ 리μμ€ λ©ν μμ± (μΈμ¦ ν¬ν¨)μ μ€μν λ€μ μΌλΆλ₯Ό μ€μν©λλ€.
μ:
def override_urls(self):
return [
url(r'^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/tags%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_tags'), name='api_article_tags'),
]
def dispatch_tags(self, request, **kwargs):
return ArticleTagResource().dispatch('list', request, **kwargs)
μ΄λ κ²νλ©΄ κΈ°λ³Έμ μΌλ‘ ArticleTagResourceκ° λͺ©λ‘λ³΄κΈ°λ‘ μμ² λ κ²μ²λΌ / article / 1 / tags /μ μ 체 μμ²μ μ²λ¦¬ ν μ ββμμ΅λλ€ ( "list"λ₯Ό "detail"λ‘ λ³κ²½νμ¬ μΈλΆλ³΄κΈ°μ²λΌ λμνλλ‘ λ³κ²½).
λλ μμ§ μ΄κ²μ μλνμ§ μμμ§λ§ λΉμ μ΄ λ§νλλ‘ μλνλ€λ©΄ νμ€ν λ΄κ° μ·¨ν μμλ μ κ·Ό λ°©μμ΄ λ κ²μ λλ€. κ·Έλ¬λ μ¬κΈ°μ μ κ°λ³΄κ³ ν κ²μ Tastypieμ λ¬Έμ λΌκ³ μκ°ν©λλ€. κΈ°λ³Έμ μΌλ‘ μ리 μ± μ μ€λͺ λ κΈ°μ μ μ¬μ©νλ©΄ κ°λ°μκ° μμ§λ λͺ»νλ μ¬μ΄μ μμ ν μ°ν ν μ μμ΅λλ€.
λλ κ°μ λ¬Έμ κ° μμκ³ joeribekkerμ λ°©λ²κ³Ό λμΌν κ²°κ³Όλ₯Ό μλνλλ° μΈμ μ΄κ²μ΄ μμ λ μ§ μκ°νμλκΉ? λλ ν΄κ²° λ°©λ²?
λλ Resource.dispatch()
μ μ¬μ©νλ μμ΄λμ΄λ₯Ό μ’μνμ§λ§, μΈλΆ μ¬ν λλ λͺ©λ‘λ³΄κΈ°λ³΄λ€ λ 볡μ‘ν μμ
μ μννλ €λ©΄ μ€μ λ‘ μ€ν κ°λ₯νμ§ μμ΅λλ€.
μ κ° μκ°νκ³ μλ ν κ°μ§ ν΄κ²°μ±
μ Resource.dispatch()
μμ Resource.wrap_view()
λ‘ λ λ¬΄κ±°μ΄ λ¦¬νν
μ μ΄λνμ¬ wrap_view()
μ¬μ©νμ¬ λͺ¨λ λ·°λ₯Ό μμλ‘ λννλ κ²μ
λλ€. μΈμ¦, κΆν λΆμ¬ λ° μ ν κ·μΉ (μλμ μμΈν μ€λͺ
λμ΄ μμ§λ§ λ©μλ κ²μ¬λ κ°λ₯ν¨).
μ€λ‘ν λ§κ³Ό κ΄λ ¨νμ¬μ΄ λ¬Έμ κ° λ°μνμ΅λλ€. νμ¬ ν΄κ²° λ°©λ²μ μ¬μ©μ μ μ λ·°λ₯Ό @apply_throttle
λννλ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ κ²μ
λλ€. λ°μ½λ μ΄ν°λ Resource.throttle_check()
λ° Resource.log_throttled_access()
μμ μ½λλ₯Ό λ€μκ° λ³΅μ¬ν©λλ€.
μ¬μ μλ₯Ό μ¬μ©νλ €λ κ°λ°μμ μλκ° λ€μκ³Ό κ°μ κ²½μ°, tastypieκ° λ μμ ν wrap_view()
(μμ λ΄μ© ν¬ν¨) _and_ λ°μ½λ μ΄ν° (λλ μ΄λ¬ν κ²λ€μ μ νμ μΌλ‘ μ μ©νλ λ€λ₯Έ λ°©λ²)λ₯Ό λͺ¨λ κ°λ κ²μ΄ κ°μ₯ ν¨κ³Όμ μΌ μ μμ΅λλ€
μ΄λ¬ν μ루μ μ λν λͺ¨λ μ¬λλ€μ μκ°μ 무μμ λκΉ? μ΄ μμ μ νμ€ν κ΄μ¬μ΄ μμ§λ§ μ§κΈ λΉμ₯μ μκ°μ΄ λλν©λλ€.
λλ μ΄κ²μΌλ‘ μ΄λ €μμ κ²ͺκ³ μμ§λ§ SOλ₯Ό λ°κ²¬νκ³ λλ΅νμ΅λλ€.
http://stackoverflow.com/questions/11827368/tastypie-override-urls-ignores-authentication-and-authorization
μ΄κ²μ μ€λλ μ€λ λμ΄μ§λ§ λ¬Έμ κ° μ¬μ ν μ΄λ € μκ³ λ΄ κ²μμμ λμ μμλ₯Ό μ°¨μ§νκΈ° λλ¬Έμ ...
νΈλ€λ¬μ 첫 λ²μ§Έ μ€μμλ self.is_authenticated(request)
κ° λ¬Έμ λ₯Ό μ²λ¦¬ν©λλ€. tastypie 0.11 λ° 0.12λ‘ ν
μ€νΈλμμ΅λλ€.
μΏ‘λΆμ μ΄μ prepend_urls () λ΄λΆμμ self.wrap_view ()λ₯Ό μ¬μ©νμ¬μ΄ λ¬Έμ λ₯Ό μ’ κ²° ν κ²μ κΆμ₯ν©λλ€.
wrap_view μ΄λ²€νΈ, νΈλ€λ¬ λ©μλμ self.is_authenticated(request)
νμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λλ μμ§ μ΄κ²μ μλνμ§ μμμ§λ§ λΉμ μ΄ λ§νλλ‘ μλνλ€λ©΄ νμ€ν λ΄κ° μ·¨ν μμλ μ κ·Ό λ°©μμ΄ λ κ²μ λλ€. κ·Έλ¬λ μ¬κΈ°μ μ κ°λ³΄κ³ ν κ²μ Tastypieμ λ¬Έμ λΌκ³ μκ°ν©λλ€. κΈ°λ³Έμ μΌλ‘ μ리 μ± μ μ€λͺ λ κΈ°μ μ μ¬μ©νλ©΄ κ°λ°μκ° μμ§λ λͺ»νλ μ¬μ΄μ μμ ν μ°ν ν μ μμ΅λλ€.