나는 django를 배우려고 노력 중이므로 현재 솔루션을 가지고있는 동안 django의 모범 사례를 따르는 지 확실하지 않습니다. 내 웹 사이트에 웹 API의 정보를 표시하고 싶습니다. API URL이 다음과 같다고 가정 해 보겠습니다.
http://api.example.com/books?author=edwards&year=2009
그러면 2009 년에 작성된 Edwards의 도서 목록이 반환됩니다. 다음 형식으로 반환됩니다.
{'results':
[
{
'title':'Book 1',
'Author':'Edwards Man',
'Year':2009
},
{
'title':'Book 2',
'Author':'Edwards Man',
'Year':2009}
]
}
현재 다음과 같이 내보기 파일에서 API를 사용하고 있습니다.
class BooksPage(generic.TemplateView):
def get(self,request):
r = requests.get('http://api.example.com/books?author=edwards&year=2009')
books = r.json()
books_list = {'books':books['results']}
return render(request,'books.html',books_list)
일반적으로 models.py 파일의 데이터베이스에서 데이터를 가져 오지만이 API 데이터를 models.py 또는 views.py에서 가져와야하는지 확실하지 않습니다. models.py에 있어야하는 경우 누군가이를 수행하는 방법에 대한 예제를 제공 할 수 있습니까? 위의 예를 stackoverflow에 대해 별도로 작성 했으므로 모든 버그는 순전히 여기에 작성한 결과입니다.
해결 방법
저는 이러한 종류의 로직을 별도의 서비스 레이어 (services.py)에 배치하는 방식을 좋아합니다. 렌더링하는 데이터는 Django ORM 의미에서 "모델"이 아니며 단순한 "보기"논리 이상입니다. 깨끗한 캡슐화를 통해 지원 서비스에 대한 인터페이스 제어 (즉, 매개 변수가있는 Python API 대 URL처럼 보이게 함), @sobolevn이 언급 한대로 캐싱과 같은 개선 사항을 추가하고 API를 격리 테스트하고, 기타
따라서 다음과 같은 간단한 services.py
를 제안합니다.
def get_books(year, author):
url = 'http://api.example.com/books'
params = {'year': year, 'author': author}
r = requests.get(url, params=params)
books = r.json()
books_list = {'books':books['results']}
return books_list
매개 변수가 어떻게 전달되는지 확인합니다 ( requests
패키지의 기능 사용).
그런 다음 views.py
에서 :
import services
class BooksPage(generic.TemplateView):
def get(self,request):
books_list = services.get_books('2009', 'edwards')
return render(request,'books.html',books_list)
또한보십시오:
참조 페이지 https://stackoverflow.com/questions/30259452
'파이썬' 카테고리의 다른 글
파이썬 Concatenation of many lists in Python (0) | 2020.11.24 |
---|---|
파이썬 boto3을 사용하여 버킷 내용 나열 (0) | 2020.11.24 |
파이썬 for 루프를 사용하여 사전 채우기 (Python) (0) | 2020.11.23 |
파이썬 Python over Tor를 사용하여 요청하기 (0) | 2020.11.23 |
파이썬 "[오류 6] 핸들이 잘못되었습니다."를 수정하려면 어떻게해야합니까? PySerial 사용 (0) | 2020.11.23 |
댓글