'Python/Django'에 해당되는 글 13건

  1. 2017.03.08 [Django] Dynamic URL
  2. 2017.03.07 [Django] VIew와 URL conf
  3. 2017.03.07 [Django] urls.py 특징.
urlpatterns = [
    url(r'^time/$', current_datetime),
    url(r'^time/plus/1/$', one_hour_ahead),
    url(r'^time/plus/2/$', two_hours_ahead),
    url(r'^time/plus/3/$', three_hours_ahead),
]

해당 URL 매핑이 있다고 가정하자, /time/plus/1 은 1시간 미래를 보여주고

/time/plus/2 는 2시간 미래,

/time/plus/3 는 3시간 미래를 보여주는 url 맵핑이다.


분명이 위의 URL 맵핑에는 문제가 있다.


위의 urlpattern들은 중복적인 기능을 제공 하고, 기능자체가 (1시간, 2시간, 3시간) 만 지원할 수 있으므로 효율성이 떨어집니다.


만약, 4시간의 기능이 필요할 경우 URL conf를 새로하나 추가해줘야한다는 번거로움이 생깁니다.


임의의 시간으로 오프셋을 처리하기 위해서 어플리케이션을 다시 설계해 봅시다.


urlpatterns = [
    # ...
    url(r'^time/plus/\d+/$', hours_ahead),
    # ...
]

저렇게 만들면 가능할 것 같지만, /time/plus/100000000 도 가능한 값이 되어버리므로, 좀더 합당한 값을 가질 수 있도록 다시 수정해봅시다.


url(r'^time/plus/\d{1,2}/$', hours_ahead),

자 이제 이것을 View 함수에 전달하기 위해서 ()로 쌉니다.


url(r'^time/plus/(\d{1,2})/$', hours_ahead),

정리하자면 아래와 같습니다.


from django.conf.urls import include, url
from django.contrib import admin
from mysite.views import hello, current_datetime, hours_ahead  
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^hello/$', hello),
    url(r'^time/$', current_datetime),
    url(r'^time/plus/(\d{1,2})/$', hours_ahead),
]

여기서 보통은 이런식으로 처리하면 되지 않을까 생각할 수 있습니다. (일반적인 다른 웹프로그래밍 언어등을 따져보자면, )


/time/plus?hours=3


위와 같은 ? 로 처리하는 방식이 낫다고 생각 할 수 있지만 Django의 철학중 하나는 URL이 깨끗하고 심플하고 더 읽기쉽고 더 쉬워야 한다는 철학이 있습니다.

아름다운 URL은 퀄리티 높은 웹 응용 프로그램의 특징입니다.


결국 /time/plus/hours/3 을 사용하라는 말입니다.



자 이제 hours_ahead 뷰를 작성해 보겠습니다. 이전에 작선한 current_datetime 뷰와 매우 비슷합니다.


from django.http import Http404, HttpResponse
import datetime

def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "In %s hour(s), it will be  %s." % (offset, dt)
    return HttpResponse(html)

위의 URLconf에서 보면 숫자가 1~2글자일경우만 가능하지만, 만약의 경우를 대비해서 ValueError을 계속 확인하는 것은 좋은 습관입니다.


def hours_ahead(request, offset):
    # try:
    #     offset = int(offset)
    # except ValueError:
    #     raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "In %s hour(s), it will be %s." % (offset, dt)
    return HttpResponse(html)

자 해당 try except 구문의 주석을 해보고 

/time/plus/3/ 을 호출해 봅시다.


그럼 TypeError가 날겁니다.


왜냐하면 timedelta에 string 형 변수를 전달했기 때문입니다.



자 위의 사진을 보고 에러를 판단하는 방법에 대해서 알아봅시다.


페이지의 상단에서 우선 정보를 얻습니다.


unsupported type 그리고 Exception Location 에서 에러가 난 행 번호를 봅니다.


Django 에서는 파일 이름, 함수, 메소드 이름, 행 번호 및 해당 행의 소스코드를 표시해 줍니다.


소스라인을 선택하면 오류가 있는 라인의 여러라인이 표시됩니다.



자여기서 밑에 사진이 살짝 짤렸지만 Local vars를 클릭해보면 해당 프레임 즉 저 에러가 난 부분에서의 모든 Local 변수들을 볼 수 있습니다.



예외가 발생한 코드의 정확한 위치를 알 수 있고, 위의 디버깅 정보는 개발하는데 있어서 큰 도움이 될겁니다.



일시적으로 Assertion을 일부러 삽입해서 오류 페이지를 강제로 띄우게 할 수도 있습니다. 그런 다음 프로그램의 로컬 변수와 상태를 볼 수 있죠,


아래와 같이 코드하면 됩니다.


def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    assert False
    html = "In %s hour(s), it will be %s." % (offset, dt)
    return HttpResponse(html)


'Python > Django' 카테고리의 다른 글

[Django] RestFrameWork 튜토리얼 - 1. 직렬화  (0) 2017.03.10
[Django] 템플릿 태그와 필터  (0) 2017.03.08
[Django] 템플릿  (0) 2017.03.08
[Django] VIew와 URL conf  (0) 2017.03.07
[Django] urls.py 특징.  (0) 2017.03.07
Posted by C마노
,

python manage.py runserver 를 했을때, 스크립트는 프로젝트 내부 디렉토리의 settings.py 파일을 찾는다.


이 파일은 장고 프로젝트를 위한 모든 설정을 포함하고 있습니다.


모든것은 대문자이고 TEMPLATE_DIRSDATABASES, etc. 


가장 중요한것은 ROOT_URLCONF 입니다.


이 옵션이 Django 에서 URL 의 ROOT로 지정되어야 한다고 알려준다.


ROOT_URLCONF = 'mysite.urls'
이것을 잘 보면 실제 경로는 mysite/urls.py 이라는 것을 알 수 있다.


특정 URL에 대한 요청이 들어올때 Django는 ROOT_URLCONF 를 보고 urls.py를 로드합니다.


그리고 matching 되는 url을 찾습니다.


매칭되는 하나를 찾으면, 그 패턴과 관련된 뷰 함수를 호출하여 첫번째 매개 변수로 HttpRequest 객체를 전달합니다.


그리고 View 함수는 무조건 HttpResponse를 반환해야 합니다.


우선 이 작업이 끝나고 나면 Django가 나머지 작업을 수행합니다. 


적절한 HTTP 헤더와 Body ( 즉 웹페이지의 내용 )을 사용하여 Python 객체를 적절한 Web Response로 변환합니다.


요약하면 아래와 같습니다.


1. 사용자가 /hello/ 의 요청을 보냅니다.


2. Django는 ROOT_RULCONF 를 보고 루트 URLconf 를 결정합니다.


3. Django는 /hello/ 와 일치하는 URLconf 의 모든 URL 패턴을 찾습니다.


4. 만약 일치하는 것을 찾으면 관련 뷰 함수를 호출합니다.


5. 해당 View 함수는 HttpResponse를 반환합니다.


6. Django는 HttpResponse를 적절한 HTTP 응답으로 변환하여 웹페이지를 생성합니다.


이것은 장고로 구동되는 페이지를 만드는 기본입니다.



'Python > Django' 카테고리의 다른 글

[Django] RestFrameWork 튜토리얼 - 1. 직렬화  (0) 2017.03.10
[Django] 템플릿 태그와 필터  (0) 2017.03.08
[Django] 템플릿  (0) 2017.03.08
[Django] Dynamic URL  (0) 2017.03.08
[Django] urls.py 특징.  (0) 2017.03.07
Posted by C마노
,

This tells Python that the string is a “raw string” – its contents should not interpret backslashes.


In normal Python strings, backslashes are used for escaping special characters – such as in the string “\n”, which is a one-character string containing a newline. When you add the r to make it a raw string, Python does not apply its backslash escaping – so, “r'\n'” is a two-character string containing a literal backslash and a lowercase “n”.


Django는 URL 패턴을 검사하기 전에 들어오는 모든 URL 앞에 슬래시를 제거합니다.


즉 /hello/ 라고 치면 제일 처음 / 는 의미가 없어져버리는 것임.


그리고 제일 뒤에 $ 달러사인이 없어버리면 모든 


^hello/ 라고 쳤을 경우 뒤에 모든 문자열이 매칭이 되어버림.


꼭 뒤에 $ 를 붙이도록 하자.


후행슬래쉬는 무조건 필요하다. APPEND_SLASH 설정이 되어있을경우는

없어도 된다.


또한 중요하게 생각해야 한다는 것은. hello라는 Function을 전달했다는 것이 포인트이다.


이것은 Python의 핵심기능중 하나임. (함수포인터라고 생각하면 편할듯...)


[장고에서 자주사용하는 정규표현식]


SymbolMatches
. (dot)Any single character
\dAny single digit
[A-Z]Any character between A and Z (uppercase)
[a-z]Any character between a and z (lowercase)
[A-Za-z]Any character between a and z (case-insensitive)
+One or more of the previous expression (e.g., \d+ matches one or more digits)
[^/]+One or more characters until (and not including) a forward slash
?Zero or one of the previous expression (e.g., \d? matches zero or one digits)
*Zero or more of the previous expression (e.g., \d* matches zero, one or more than one digit)
{1,3}Between one and three (inclusive) of the previous expression (e.g., \d{1,3} matches one, two or three digits)


'Python > Django' 카테고리의 다른 글

[Django] RestFrameWork 튜토리얼 - 1. 직렬화  (0) 2017.03.10
[Django] 템플릿 태그와 필터  (0) 2017.03.08
[Django] 템플릿  (0) 2017.03.08
[Django] Dynamic URL  (0) 2017.03.08
[Django] VIew와 URL conf  (0) 2017.03.07
Posted by C마노
,