Django Book 학습 노트(상)

20975 단어 django
온라인에서 Django Book을 읽었습니다. 이제 정리를 해보도록 하겠습니다...
하나.Django 구성
매우 알이 아프다. Django의 블록 그룹 간의 결합도가 낮기 때문에 이것은 그것의 장점이자 단점이다.내가 Ubuntu에서 설정한 Django의 개발 환경은 다음과 같다. Django1.6+PostgreSQL+Nginx+uwsgi+Memcached(캐시 메커니즘).설정하기가 정말 번거롭지만, uwsgi는 Django와 Nginx 사이의 다리로서 정말 유용하다고 말할 수 밖에 없다.
스스로 인터넷에 접속해서 검색할 수 있도록 설정하는 방법을 알고 싶다.여기는 더 이상 말할 필요가 없다.
둘.Django의 몇 가지 중요한 명령
>>>python manage.py shell  #      
>>>python setup.py install  #  Django
$:django-admin.py startproject mysite   #    web  
>>>python manage.py runserver     #  Django      
$:uwsgi -s :    -w run_uwsgi(    )  
>>>python manage.py startapp books   # APP
>>>python manage.py syncdb   # sql

셋.보기 및 URL 설정
hello의 demo:
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

동시에 urls.py는 다음과 같이 구성됩니다.
from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
    ('^hello/$', hello),
)

Django가 사용하고자 하는 정규 기호를 부록해 봅시다. (하지만 자신이 먼저 정규 표현식을 배우는 것이 좋습니다):
기호
일치
. (dot)
모든 단일 문자
\d
임의의 숫자
[A-Z]
A-Z 문자(대문자)
[a-z]
a-z 문자(소문자)
[A-Za-z]
a-z 문자(대소문자 구분 안 함)
+
하나 이상의 일치(예:\d+는 하나 이상의 숫자 문자와 일치)
[^/]+
'/' 이 아닌 하나 이상의 문자
*
0개 또는 이전 표현식(예:\d? 0개 또는 숫자 일치)
*
0자 이상 일치(예:\d*0자 이상 숫자 일치)
{1,3}
한 개와 세 개(포함) 이전의 표현식(예를 들어\d{1,3}은 한 개 또는 두 개 또는 세 개의 숫자와 일치함)
Django에서 요청된 보기(request)와 응답 보기(response)의 과정은 대체로 다음과 같습니다.
들어오신 요청 전입/hello/.
딱꼬 통과. 로또에서...루트 URLconf.
Django는 URLconf의 모든 URL 모드에서/hello/와 일치하는 첫 번째 항목을 찾습니다.
일치하는 것을 찾으면 보기 함수 를 호출합니다.
보기 함수가 HttpResponse를 반환합니다.
   6.Django가 Http Response를 웹 페이지에 적합한 HTTP response로 변환
 
넷.거푸집
템플릿의 호출은 복잡하지 않지만 템플릿의 탭에 대한 내용이 좀 많기 때문에 이 부분은 Django Book을 봐야 할 것 같습니다
다음은 템플릿 상속과 가장 간단하게 호출하려는 데모를 보여 줍니다.
Bash.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>
current_datetime.html
{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
#views.py  current_datetime  
from django.shortcuts import render_to_response
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})

 
오.모델
모델을 소개하기 전에 Django가 다른 MVC 프레임워크와 다른 또 다른 사상인 MTV사상을 소개한다.
Django는 이런 MVC 모델을 굳게 따르고 있어 일종의 MVC 프레임워크라고 할 수 있다.다음은 Django의 M, V, C 각각의 의미입니다.
M, 데이터 액세스 부분은django 데이터베이스 층에서 처리하고 이 장에서 설명하고자 하는 내용.
V, 표시할 데이터와 표시할 부분을 선택하여 보기와 템플릿으로 처리합니다.
C, 사용자 입력 위임 보기 부분에 따라 Django 프레임워크가 URLconf 설정에 따라 주어진 URL에 적당한 Python 함수를 호출합니다.
C는 프레임워크가 자체적으로 처리하기 때문에 Django에서 더욱 주목하는 것은 모델(Model), 템플릿(Template)과 보기(Views)이다. Django도 MTV 프레임워크라고 부른다.MTV 개발 모델:
M은 모델(Model), 즉 데이터 액세스 레이어를 나타냅니다.이 층은 데이터와 관련된 모든 사무를 처리한다. 어떻게 액세스하고 유효성을 검증하며 어떤 행위를 포함하고 데이터 간의 관계를 포함하는지 등이다.
T는 템플릿(Template), 즉 표현 레이어를 나타냅니다.이 층은 표현과 관련된 결정을 처리합니다. 페이지나 다른 유형의 문서에 표시할 방법입니다.
V는 뷰(View), 즉 비즈니스 논리 레이어를 나타냅니다.이 층은 액세스 모델과 적절한 템플릿을 추출하는 논리를 포함한다.너는 그것을 모형과 틀 사이의 다리로 볼 수 있다.
만약 다른 MVC 웹 개발 프레임워크에 익숙하다면, 예를 들어 Ruby on Rails라면, Django 보기는 컨트롤러이고, Django 템플릿은 보기라고 생각할 수도 있습니다.불행하게도 MVC의 다른 해석에 따른 잘못된 인식이다.Django가 MVC에 대한 해석에서 보기는 사용자에게 보여줄 데이터를 설명하는 데 사용된다.데이터가 어떻게 드러나고 어떤 데이터가 드러나는지가 아니다.이에 비해 Ruby on Rails와 같은 프레임워크 권장 컨트롤러는 사용자에게 어떤 데이터를 보여줄지 결정하고, 보기는 어떤 데이터를 보여줄지 결정하는 것이지 어떤 데이터를 보여줄지 결정한다.
두 가지 해석 중 어느 것도 더 정확하지 않다.중요한 것은 밑바닥 개념을 이해하는 것이다.
모형의 내용이 매우 많으니 스스로 책을 좀 보는 것이 좋겠다.
여섯.관리
Django는 php의 phpmyadmin과 유사한 데이터베이스를 관리하는 모듈을 가지고 있습니다.
 
일곱양식
GET 메서드의 demo:
def search(request):
    error = False
    if 'q' in request.GET:
        q = request.GET['q']
        if not q:
            error = True
        else:
            books = Book.objects.filter(title__icontains=q)
            return render_to_response('search_results.html',
                {'books': books, 'query': q})
    return render_to_response('search_form.html',
        {'error': error})

POST 메서드의 demo:
from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def contact(request):
    errors = []
    if request.method == 'POST':
        if not request.POST.get('subject', ''):
            errors.append('Enter a subject.')
        if not request.POST.get('message', ''):
            errors.append('Enter a message.')
        if request.POST.get('email') and '@' not in request.POST['email']:
            errors.append('Enter a valid e-mail address.')
        if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', '[email protected]'),
                ['[email protected]'],
            )
            return HttpResponseRedirect('/contact/thanks/')
    return render_to_response('contact_form.html',
        {'errors': errors})

기억: 성공적인 GET 요청에 대해서는render 를 사용해야 합니다.to_response 되돌리기;성공적인 POST 요청에 대해 Http Response Redirect를 응용하여 방향을 바꾸는 것은 웹 개발의 가장 좋은 실천이다.
여덟html 이외의 내용 내보내기
뷰 및 MIME 유형:
보기 함수는 웹 요청을 매개 변수로 하고 웹 응답을 되돌려주는 Python 함수입니다.이 응답은 웹 페이지의 HTML 내용, 점프, 404 오류, XML 문서, 그림, 혹은 어떤 것에 비칠 수 있습니다.
png 이미지를 출력하려면 다음과 같이 하십시오.
from django.http import HttpResponse

def my_image(request):
    image_data = open('/home/dzhwen/swift.jpg')
    return HttpResponse(image_data,mimetype="image/png")

CSV 파일을 내보내려면 다음과 같이 하십시오.
import csv
from django.http import HttpResponse

# Number of unruly passengers each year 1995 - 2005. In a real application
# this would likely come from a database or some other back-end data store.
UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]

def unruly_passengers_csv(request):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=unruly.csv'

    # Create the CSV writer using the HttpResponse as the "file."
    writer = csv.writer(response)
    writer.writerow(['Year', 'Unruly Airline Passengers'])
    for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):
        writer.writerow([year, num])

    return response

pdf 파일을 출력하려면 다음과 같이 하십시오.
from cStringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse

def hello_pdf(request):
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=hello.pdf'

    temp = StringIO()
    p = canvas.Canvas(temp)

    p.drawString(100,100,"Hello world.")
    p.showPage()
    p.save()

    return response

아홉세션, 사용자 및 등록
좋고 나쁨이 반반인 쿠키.
아마도 당신은 이미 cookies의 업무 방식이 초래할 수 있는 문제를 알아차렸을 것입니다.여기서 몇 가지 중요한 질문을 살펴보겠습니다.
쿠키의 저장은 자원적인 것이기 때문에 클라이언트가 반드시 쿠키를 받아들이거나 저장해야 하는 것은 아니다.사실상 모든 브라우저는 사용자가 cookies를 받아들일지 안 받아들일지를 스스로 제어할 수 있게 한다.웹 응용 프로그램에 cookies가 얼마나 중요한지 알고 싶으면 이 브라우저의 옵션을 열어 보십시오:  
비록 cookies가 널리 사용되고 있지만 여전히 믿을 수 없는 것으로 여겨진다.이것은 개발자가 쿠키를 사용하기 전에 사용자가 쿠키를 받을 수 있는지 확인해야 한다는 것을 의미한다.
 
쿠키(특히 HTTPS를 통해 전송되지 않은 것들)는 매우 안전하지 않다.HTTP 데이터는 명문으로 발송되기 때문에 특히 후탐 공격을 받기 쉽다.즉, 탐지 공격자는 인터넷에서 cookies를 차단하고 읽을 수 있기 때문에 cookies에 민감한 정보를 저장하는 것을 절대 피해야 한다.이것은 귀하가 어떠한 민감한 정보를 저장하기 위해 쿠키를 사용해서는 안 된다는 것을 의미합니다.
 
'중간자'라고 불리는 공격이 더 음험하다. 공격자가 쿠키를 차단하고 다른 사용자에게 사용한다.제19장은 이런 공격의 본질과 어떻게 피하는지에 대해 깊이 있게 토론할 것이다.
 
예상한 수신자로부터 되돌아오는 쿠키도 안전하지 않다.대부분의 브라우저에서 cookies의 정보를 쉽게 수정할 수 있습니다.경험이 있는 사용자는 심지어 mechanize(http://wwwsearch.sourceforge.net/mechanize/이러한 도구는 HTTP 요청을 수동으로 구성합니다.
 
따라서 쿠키에 변경될 수 있는 민감한 데이터를 저장할 수 없습니다.cookies에 IsLoggedIn=1을 저장하여 사용자가 로그인했음을 나타냅니다.이런 오류를 저지른 사이트의 수가 믿기지 않는다.이들 사이트를 돌아다니는 보안 시스템도 손바닥을 뒤집듯이 쉽다.

좋은 웹페이지 즐겨찾기