2014-10-20 19 views
4

나는 PHP 배경에서 왔고 파이썬을 배우려고했지만 디버깅과 관련하여 장고 나 파이썬에서 일반적으로 어떻게할지는 아직 확실하지 않으므로 많은 문제가 있습니다.어떻게 장고에서 문제를 해결할 수 있습니까?

저는 PHP의 모든 내용을 print_r 또는 var_dump까지 할 수있었습니다. 나는 컨트롤러에서 그것을 할 수있다. 서비스 레이어에서 또는 심지어 모델과 데이터가 내 웹 브라우저에 나타날 것이다.

장고에서는이 작업을 수행 할 수 없습니다. 내가하는 일에 따라, 내보기에서 객체에 print을 수행하려고 시도하면 페이지가 다운되거나 콘솔에 출력되어 실제로 도움이되지 않습니다. 다음은 예입니다 :

class Page(View): 
    def get(self, request, *args, **kwargs): 
     response = Data.objects.all() 

     # for whatever reason, I want to print something right now: 
     print response 

     # return JsonResponse({'success':response}) 

위 완전히 통지 말을 내 페이지를 아래로 걸릴 것입니다 :

The view didn't return an HttpResponse object. It returned None instead. 

나는 데이터 만 덤프를 얻을 수났습니다 곳 CBV의 작업하는 동안 몇 가지 경우가 있습니다 콘솔 같은 곳. 그러나 그것은 나를 도울 수있는 어떤 것도 아니다. 내가 위에서 response의 내용을 살펴보고하려고 경우 예를 들어, 그냥과 같이 나타날 것입니다 :

[object Object] [object Object] [object Object] 

var_dump 나 실제로 그것의 내부를 볼 수있는 것이다.

저는이 모든 잘못에 대해 생각하고 있습니다. 사람들이 Python으로 디버깅 할 때 데이터를 덤프합니까? 그럴 경우 어떻게 수행할까요? 웹 브라우저 나 콘솔에 어떻게 나타나나요? 그렇지 않다면 어떻게 장고에서 기본적인 문제 해결을 처리합니까? 예 시나리오 : 난

  • 는 I가 함수에 의해 실행되는 경우 표시 할 ORM 의해 수행되는 원시 SQL 쿼리를 보려는 목록 또는 사전
  • 의 내용을 표시 할

    1. 프론트 엔드에서 출력 할 텍스트 일부를 빼는 것
  • 답변

    4

    기본 문제는 PHP가 전체 요청/응답 체인에 어떻게 연결되어 있는지에 익숙해 져 있으며 웹 응용 프로그램을 개발할 때 파이썬이 어떻게 구성되어 있지 않은지입니다.

    PHP 세계에서 서버는 요청/응답주기를 닫는 응답을 보장합니다. PHP 파일은 브라우저에서 직접 요청하므로 백그라운드에서 실제로 일어나고있는 것을 알지 못합니다.

    일반적인 PHP 요청은 일반 index.html 파일 또는 logo.gif과 같은 정적 애셋 요청과 동일합니다. 브라우저가 요청하고 웹 서버가 요청을 수락 한 다음 응답을 반환합니다. 유일한 차이점은 .php 인 파일이 요청되면 PHP 인터프리터가 파일을 평가하는 중개 단계를 거쳐 결과를 클라이언트에 다시 보냅니다.

    그러나 파이썬에서는 파이썬 백엔드 프로세스 (때로는 업스트림 프로세스라고 함)에 매핑되는 요청이 만들어지면; 웹 서버는 프로세스의 응답을 기다립니다 (이 시간 초과는 조정할 수 있습니다). 정의 된 시간 초과 내에 응답이 수신되지 않으면 웹 서버는 시간 초과 오류 페이지 (504 ERROR)를 전송합니다.

    브라우저에서 예상 한대로 (모든 헤더와 함께) 적절한 응답을 보내는 것은 Python 프로세스의 책임입니다. PHP에서는 PHP 엔진이 이러한 추가 정보를 추가하기 때문에 개발자에게는이 코드가 숨겨져 있습니다. 따라서 파이썬 코드에서 그러한 응답을 보내지 않으면 django는 친절한 오류 메시지를 출력하여 도움을줍니다.

    보기에 응답이 응답을 반환하지 않습니다. 그것의 단지 인쇄 무언가. 이 print 문은 응용 프로그램의 표준 출력 (또는 오류 스트림)으로 이동합니다 (쉘에서 실행하거나 서버의 로그에 기록한 경우 콘솔에 인쇄됩니다). 클라이언트 (브라우저). 디버그 장고 응용 프로그램을 위해

    :

    1. 확실 DEBUG = True 확인 지금 python manage.py runserver

    사용하여 응용 프로그램을 실행하여 settings.py

  • 에 설정되어있는 어떤 인쇄 문을 수행 할 때, 그것은 것입니다 콘솔에 표시되고 응용 프로그램 코드에 오류가있는 경우 - 유효한 응답을 반환하는 한 - 문제를 식별하는 데 도움이되는 스택 추적과 함께 풍부한 오류 페이지가 표시됩니다.

    개발할 때 더 이상 "디버깅 문과 브라우저에서 인쇄 작업"이 없습니다. 이것은 파이썬이 웹 세계에 어떻게 연결되어 있는지를 보여줍니다. 다른 질문

    는 :

    1. 나는 간단하게 인쇄 목록 또는 사전

      의 내용을보고 싶어요. 출력은 콘솔 (당신이 python manage.py runserver을 쓴 같은 장소)에있을 것입니다

    2. 난 당신이 django shell에 물건을 테스트하는 경우 ORM

      에 의해 수행되는 원시 SQL 쿼리를보고 싶어, 당신이 할 수있는 단지 쿼리가 전송되는 확인하려면 ORM 호출의 끝에서 .query을 넣어 :

      >>> result = MyModel.objects.filter(foo='bar') 
      >>> result.query 
      (query printed here) 
      

      더 풍부한 디버깅 경험을 들어, django_debug_toolbar를 설치합니다.

    3. 는 I는 기능 번호 "프론트 엔드로 출력"없다 내측 선단부

      에 출력되는 텍스트를 미끄러짐에 의해 실행되는 경우를 참조하고 싶다. 그런 것들을 위해서, 당신은 단지 print() 당신이 필요하거나 더 나은 use the logging system 수 있습니다.

  • 1

    먼저 Django보기에는 일종의 HttpResponse 객체가 반환되어야합니다. docs- Django에 의해 자동으로 생성되는 HttpRequest 객체와는 달리 HttpResponse 객체가 사용자의 책임입니다. 작성한 각 뷰는 HttpResponse를 인스턴스화하고, 채우고 리턴합니다.

    은 당신이 응답을 반환하는 데 사용할 수있는 많은 클래스 (에는 render_to_response, HttpResponseRedirect를, JsonResponse 많은, 많은 더 - https://docs.djangoproject.com/en/dev/ref/request-response/#httpresponse-subclasses)이 있습니다. 당신의 라인 # return JsonResponse ({ 'success': response})는 #을 없애 버릴 것입니다.

    대신 var_dump 대신 Python의 dir 함수를 사용할 수 있습니다. 클래스 또는 클래스 인스턴스의 모든 속성이 표시됩니다. 참조 : Is there a function in Python to print all the current properties and values of an object?

    1. 사전을 인쇄 할 수 있습니다. 그것을 할 수있는 많은 방법이 있습니다. 쉽게 할 수있는 : (값 키, "")

    2. 인쇄 : your_dictionary.items()에서 키 값에 대한

      . Data.objects를 인쇄하십시오.all(). 질의. 참조 - How to show the SQL Django is running

    3. 또는 함수 (또는 함수가 실행 중임을 나타내는 데코레이터) 내에 print 문을 추가 할 수 있습니다.

    이들은 장고와 파이썬의 아주 기본적인 부분입니다. 무례한 일은 아니지만, 자신의 프로젝트에 착수하는 것보다 자습서를 전부 쓰는 것이 더 나을 것입니다. 일단 클릭하면 매우 간단 해집니다. MVC/MVT 프레임 워크는 PHP와는 다른 구조를 가지므로 그 안에서 작업하는 데 익숙해 져야하거나 좌절 할 것입니다.

    class Page(View): 
        def get(self, request, *args, **kwargs): 
         response = Data.objects.all() 
    
         # for whatever reason, I want to print something right now: 
         print response 
    
         return JsonResponse({'success':response}) # <-- dont comment this out 
    

    이 두 번째로, 인쇄 임의의 객체는 항상 최고의 서비스를 제공하지 않습니다 당신이 인쇄하고 있지 때문에

    3

    첫째, 당신은 오류가있는 이유는 반환에서 주석 그것 때문에이다 정보량. 무언가가 __str__ 또는 __unicode__ 메서드를 정의하면 콘솔에 출력됩니다. 그렇지 않으면 개체 이름과 메모리 ID가 인쇄됩니다. 가장 유용한 것은 아닙니다. 개체를 인쇄해도 "깊은"인쇄는 수행되지 않습니다.

    당신은 지역 주민과 전역 인쇄를 시도 할 수 있습니다 :

    print(locals()) 
    print(globals()) 
    

    또는 JSON에 개체를에는 직렬화 것을 인쇄 :

    print(json.dumps(response)) # some objects may not be serialisable to JSON though. 
    

    하지만 당신은 당신이 원하는 세부 정보의 양을 얻을 수 있습니다 그것도. 대안은 디버그 모드에서 웹 서버를 실행하고 예외 제기하는 것입니다 ..

    # settings.py 
    DEBUG = True 
    
    # views.py 
    def my_view(request): 
        raise Exception('debug') 
    

    을 당신에게 스택 추적을 포함하는 디버그 오류 페이지를 표시하는 장고에 의존하고 모든 검사 할 수 있습니다 변수는 각 프레임에서 사용할 수 있습니다.

    +0

    +1 'DEBUG'모드의 경우 - 이것이 정확히 무엇 때문이었습니다. – Ben

    관련 문제