학교/DJANGO

Django 기말고사 대비 정리

서윤-정 2024. 6. 19. 00:19

1. 장고 프로젝트 만들기

 

1-1. 장고의 특징

1) MVC 패턴 기반 MVT

2) 객체 관계 매핑

3) 자동으로 구성되는 관리자 화면

4) 우아한 URL 설계

5) 자체 탬플릿 시스템

6) 캐시 시스템

7) 다국어 지원

8) 풍부한 개발 환경

9) 소스 변경사항 자동 반영

 

 

 

 

 

1-2. 장고 설치하기

>pip install django

>python -m django --version

 

 

1-3. 프로젝트 만들기

>django-admin startproject 프로젝트명

 

 

 

2. polls 앱 만들기

$ python manage.py startapp polls

 

 

3. views 코드 작성하기

[polls\views.py]

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.urls import reverse
from polls.models import Choice, Question


def index(request):
    latest_question_list = Question.objects.all().order_by(‘-pub_date’)[: 5]
    context = {‘latest_question_list’: latest_question_list}
    return render(request, ‘polls / index.html’, context)

    def detail(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        return render(request, ‘polls / detail.html’, {‘question’: question})

        def results(request, question_id):
            question = get_object_or_404(Question, pk=question_id)
            return render(request, 'polls/results.html', {'question': question})

        def vote(request, question_id):
            question = get_object_or_404(Question, pk=question_id)
            try:
                selected_choice = question.choice_set.get(pk=request.POST['choice'])
            except (KeyError, Choice.DoesNotExist):
            # Redisplay the question voting form. return render(request, 'polls/detail.html', {
            'question': question, 'error_message': "You didn't select a choice.",
            })
            else:
            selected_choice.votes += 1
            selected_choice.save()
            return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

 

 

 

4. urls 코드 작성하기

 

 

5. templates 생성하기

 

5-1. 템플릿 문법(템플릿 변수, 필터, 태그, 주석 등)

 

 

5-2. index.html

[templates/polls/index.html]

{% if latest_question_list %}
<ul>
    {% for question in latest_question_list %}
    <li><a href=“/polls/{{ question.id }}/”>{{ question.question_text }}</a></li>
    {% endfor %}
</ul>
{% else %}
<p> No polls are available. </p>
{% endif %}

 

 

5-3. detail.html

[templates/polls/detail.html]

<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{error_message}}</strong></p>{% endif %}
<form action=“{% url ‘polls:vote’ question.id %}” method=“post”>
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
    <input type=“radio” name=“choice“ id=”choice{{ forloop.counter }}“ value=”{{
           choice.id }}“/>
    <label for=“choice{{ forloop.counter }}”>{{ choice.choice_text }}</label><br/>
    {% endfor %}
    {input type=“submit” value=“Vote” />
</form>

 

 

5-4. result.html

[templates/polls/results.html]

<h1>{{ question.question_text }}</h1>
<ul>
    {% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize
        }}
    </li>
    {% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

 

 

 

 

6. 확장 앱(books) 만들기

> python manage.py startapp books

 

 

 

6-1. Model 설정하기

[books/models.py]

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField('Author')
    publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
    publication_date = models.DateField()

    def __str__(self):
        return self.title


class Author(models.Model):
    name = models.CharField(max_length=50)
    salutation = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name


class Publisher(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    website = models.URLField()

    def __str__(self):
        return self.name

 

 

 

[views.py>

from django.shortcuts import render
from django.views.generic.base import TemplateView
from django.views.generic import ListView
from django.views.generic import DetailView
from books.models import Book, Author, Publisher


class BooksModelView(TemplateView):
    template_name = 'books/index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['model_list'] = ['Book', 'Author', 'Publisher']
        return context


# ListView
class BookList(ListView):
    model = Book


class AuthorList(ListView):
    model = Author


class PublisherList(ListView):
    model = Publisher


# DetailView
class BookDetail(DetailView):
    model = Book


class AuthorDetail(DetailView):
    model = Author


class PublisherDetail(DetailView):
    model = Publisher

 

 

 

6-2. 관리자 화면에 books 앱 보이게 하기

[books/admin.py] 코드 입력하기 - 관리자 화면에 books 목록 나오게 하기

from django.contrib import admin
from books.models import Book, Author, Publisher
admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Publisher)

 

 

 

 

6-3. 데이터베이스 변경사항 추출 및 반영하기

>python manage.py makemigrations books

>python manage.py migrate books

>python manage.py runserver

 

 

 

 

 

6-4. 템플릿 상속의 개념 설명하기

(1) 개념

템플릿 사속을 통해서 템플릿 코드를 재사용할 수 있고,

사이트의 록앤필(lock & feel)을 일관성있게 보여줄 수 있다.

부모 템플릿은 템플릿의 뼈대를 만들어주고 {% block %} 태그를 통해

하위로 상속해줄 부 분을 지정해 주면,

자식 템플릿은 부모 템플릿의 뼈대는 그대로 재사용하고 {% blick %} 부분만 채워주면 된다.

 

- 템플릿 상속 : 부모 템플릿은 템플릿의 뼈대를 만들어주고 {% block %} 태그를 통해

하위로 상속해 줄 부분을 지정해주면,

자식 템플릿은 부모 템플릿의 뼈대를 그대로 재사용하고 {% block %} 부분만 채워준다.

 

▸ 템플릿 상속 3단계

▪ 1단계 : 사이트 전체의 룩앤필(look & feel)을 담고 있는 base.html을 만든다.

▪ 2단계 : 사이트 하위의 섹션별 스타일을 담고 있는

base_news.htm, base_sports.html 등의 템플릿을 만든다.

물론 2단계 템플릿들은 1단계 base.htm 템플릿을 상송 받는다.

▪ 3단계 : 개별 페이지에 대한 템플릿을 만든다.

3단계 템플릿들은 2단계 템플릿 중에서 적절한 템플릿을 상속받는다

 

 

 

 

 

6-5. templates\books 생성하기

▸ books_list.html

[books\templates\books\book_list.html]

{% extends "base_books.html" %}
{% block content %}
<h2>Book List</h2>
<ul>
    {% for book in object_list %}
    <li><a href="{% url 'books:book_detail' book.id %}">{{ book.title
        }}</a></li>
    {% endfor %}
</ul>
{% endblock content %}

 

 

 

▸ books_detail.html

[books\templates\books\book_detail.html]

{% extends "base_books.html" %}
{% block content %}
<h1>{{ object.title }}</h1>
<br>
<li>Authors:
    {% for author in object.authors.all %}
    {{ author }}
    {% if not forloop.last %},{% else %}{% endif %}
    {% endfor %}
</li>
<li>Publisher: {{ object.publisher }}</li>
<li>Publication date: {{ object.publication_date }}</li>
{% endblock content %}

 

 

 

▸ author_list.html

[books\templates\books\author_list.html]

{% extends "base_books.html" %}
{% block content %}
<h2>Author List</h2>
<ul>
    {% for author in object_list %}
    <li><a href="{% url 'books:author_detail' author.id %}">{{ author.name
        }}</a></li>
    {% endfor %}
</ul>
{% endblock content %}

 

 

 

 

▸ author_detail.html

[books\templates\books\author_detail.html]

{% extends "base_books.html" %}
{% block content %}
<h1>{{ object.name }}</h1>
<p>{{ object.salutation }}</p>
<li>Email: {{ object.email }}</li>
{% endblock content %}

 

 

 

 

▸ publisher_list.html

[books\templates\books\publisher_list.html]

{% extends "base_books.html" %}
{% block content %}
<h2>Publisher List</h2>
<ul>
    {% for publisher in object_list %}
    <li><a href="{% url 'books:publisher_detail' publisher.id %}">{{
        publisher.name }}</a></li>
    {% endfor %}
</ul>
{% endblock content %}

 

 

 

 

▸ publisher_detail.html

[books\templates\books\publisher_detail.html]

{% extends "base_books.html" %}
{% block content %}
<h1>{{ object.name }}</h1>
<p>{{ object.website }}</p>
<li>Address: {{ object.address }}</li>
{% endblock content %}

 

 

 

 

 

7. 외부로부터 상속 받을 파일 선언 기능 표현

> {% extends "base.html" %}

 

 

 

8. polls 초기 화면 html 파일

[templates/polls/index.html]

{% if latest_question_list %}
<ul>
    {% for question in latest_question_list %}
    <li><a href=“/polls/{{ question.id }}/”>{{ question.question_text }}</a></li>
    {% endfor %}
</ul>
{% else %}
<p> No polls are available. </p>
{% endif %}

 

 

 

 

 

9. mysite 초기 화면 html 파일

 

 

 

 

 

10. books list 초기 화면 html 코드

{% extends "base_books.html" %}
{% block content %}
<h2>Book List</h2>
<ul>
    {% for book in object_list %}
    <li><a href="{% url 'books:book_detail' book.id %}">{{ book.title
        }}</a></li>
    {% endfor %}
</ul>
{% endblock content %}

 

 

 

 

11. ch5에 상속 기능을 수행키 위해 외부에 templates 디렉터리 생성에 대한 환경(DIR) 설정에 표현 사항

> 'DIRS': [os.path.join(BASE_DIR, 'templates')],

 

 

 

 

 

 

12. polls와 books에 대한 DB 설정하기

>python manage.py makemigrations books

>python manage.py migrate books

>python manage.py runserver

 

 

 

 

13. urls.py의 path 설정하기

[mysite/urls.py]

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls), path('polls/', include('polls.urls')), path('books/', include('books.urls')), ]

 

 

[books\urls.py]

from django.urls import path
from . import views

app_name = 'books'
urlpatterns = [
    path('', views.BooksModelView.as_view(), name='index'),
    path('book/', views.BookList.as_view(), name='book_list'),
    path('author/', views.AuthorList.as_view(), name='author_list'),
    path('publisher/', views.PublisherList.as_view(), name='publisher_list'),
    path('book/<int:pk>/', views.BookDetail.as_view(), name='book_detail'),
    path('author/<int:pk>/', views.AuthorDetail.as_view(), name='author_detail'),
    path('publisher/<int:pk>/', views.PublisherDetail.as_view(), name='publisher_detail'),
]

 

 

 

 

 

 

 

 

14. 장고에서 templates 기능 익히기

> {% for %}, {% if %}, {% url %}, {% with %}, {% load %}, {% csrf_token %}, {{ }}, {{ data|safe }} 등

 

 

 

 

15. 서버에 자료를 보낼 때 보안 처리를 반드시 해야하는 기능은?

> {% csrf_token %}

 

 

 

 

16. {{block.super}} : 부모 base.html 템플릿에서 정의한 내용을 하위 base_books.html 템플릿에서 재사용한다는 의미

 

 

 

 

 

17. 아래 결과화면에 나오는 원인?

 

> [Project_Home] 항목을 클릭하면 에러가 발생하는 것은 루트(/) URL에 대한 처리 로직이 없기 때문임

 

 

 

 

아래와 같이 mysite/urls.py와 mysite/views.py 수정 및 ch5/templates/home.html을 작성한 다.

- mysite/urls.py 수정
 from mysite import views # 추가
 path('', views.HomeView.as_view(), name='home'), # 추가
 
 
 
 
- mysite/views.py 추가
from django.views.generic.base import TemplateView

class HomeView(TemplateView): 	
	template_name = 'home.html'

def get_context_data(self, **kwargs): 
 context = super().get_context_data(**kwargs) 
 context['app_list'] = ['polls', 'books'] 
 return contex

 

 

 

- ch5/templates/home.html 작성
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Home</title>
</head>
<body>
 {% extends "base.html" %} 
 {% block content %} 
 	<h2>Hywoman Django Applications </h2>
 	<ul>
 		{% for appname in app_list %} 
 			{% with appname|add:":"|add:"index" as urlvar %} 
 				<li><a href="{% url urlvar %}">{{ appname }}</a></li>
 			{% endwith %} 
 		{% endfor %} 
 	</ul>
 {% endblock content %}
</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-----[객관식 문제]-------------------------------------------------

 

1. 서버에서의 처리 결과에 대한 응답 메시지 중 지정한 리소스를 찾을 수 없을 때 상태 코드는?

① 400 ② 401 ③ 402 ④ 404

 

 

2. 서버에서의 처리 결과에 대한 응답 메시지로 임시적인 응답으로

현재 클라이언트의 요청 까지 잘 처리되었으니

계속 진행하라는 의미하는 상태 코드 메서드는?

① 1xx ② 2xx ③ 3xx ④ 4xx

 

 

3.서버에서의 처리 결과에 대한 응답 메시지로

클라이언트의 요청이 서버에서 성공적으로 처리되었음을 의미하는 상태 코드 메서드는?

① 1xx ② 2xx ③ 3xx ④ 4xx

 

 

4. 서버에서의 처리 결과에 대한 응답 메시지로 클라이언트는

요청을 완전한 처리를 위해서 추가적인 동작을 필요로 하는 경우의 상태 코드 메서드는?

① 1xx ② 2xx ③ 3xx ④ 4xx

 

 

5. 서버에서의 처리 결과에 대한 응답 메시지로 없는 페이지를

요청하는 것처럼 클라이언트 의 요청 메시지 내용이 잘못된 경우의 상태 코드 메서드는?

① 2xx ② 3xx ③ 4xx ④ 5xx

 

 

6. 서버에서의 처리 결과에 대한 응답 메시지로

서버 측 사정에 의해서 메시지 처리에 문제 가 발생한 경우의 상태 코드 메서드는?

① 2xx ② 3xx ③ 4xx ④ 5xx

 

 

7. 서버에서의 처리 결과에 대한 응답 메시지로 요청의 구문이 잘못되었을 경우의 상태 코 드는?

① 400 ② 401 ③ 403 ④ 404

 

 

8. 서버에서의 처리 결과에 대한 응답 메시지로

지정한 리소스에 대한 권한이 없는 경우의 상태 코드는?

① 400 ② 401 ③ 403 ④ 404

 

 

9. 서버에서의 처리 결과에 대한 응답 메시지로 지정한 리소스에 대한 액세스 권한이 없는 경우의 상태 코드는?

① 400 ② 401 ③ 403 ④ 404

 

 

10. 서버에서의 처리 결과에 대한 응답 메시지 중 지정한 리소스를 찾을 수 없을 때 상태 코드는?

① 400 ② 401 ③ 402 ④ 404

 

 

11. 서버에서의 처리 결과에 대한 응답 메시지 중

게이트웨이 또는 프록시 역할을 하는 서 버가 그 뒷단의 서버로부터 잘못된 응답을 받았을 경우에 대한 상태 코드는?

① 500 ② 501 ③ 502 ④ 503

 

 

12. 서버에서의 처리 결과에 대한 응답 메시지 중

현재 서버에서 서비스를 제공할 수 없을 때 상태 코드는?

① 500 ② 501 ③ 502 ④ 503

 

 

13. 다음 URL 구성 중 웹 서버의 호스트명으로 도메인명 또는 IP 주소로 표현되는 것은?

① URL 스킴 ② 호스트명 ③ 포트번호 ④ 쿼리스트링

 

 

14. 다음 URL 구성 중 문서 내의 앵커 등 조각을 지정하는 것은?

① URL 스킴 ② 호스트명 ③ 프라그먼트 ④ 쿼리스트링

 

 

15. 다음 URL 구성 중 질의 문자열로, 앰퍼샌드(&)로 구분된 이름=값 쌍 형식으로 표현하는 것은?

① URL 스킴 ② 호스트명 ③ 프라그먼트 ④ 쿼리스트링

 

 

16. 다음 URL 구성 중 URL에 사용된 프로토콜을 의미하는 것은?

① URL 스킴 ② 호스트명 ③ 프라그먼트 ④ 쿼리스트링

 

 

17. urlparse()함수는 URL을 파싱한 결과로 ParseResult 인스턴스를 반환하는데,

ParseResult 클래스 속성으로 URL에 사용된 프로토콜을 의미하는 것은?

① URL 스킴 ② scheme ③ netloc ④ param

 

 

18. urlparse()함수는 URL을 파싱한 결과로 ParseResult 인스턴스를 반환하는데,

ParseResult 클래스 속성으로 문서 내의 앵커 등 조각을 지정하는 것은?

① path ② scheme ③ netloc ④ fragment

 

 

19. 주어진 URL에서 데이터를 가져오는 기본 기능에 해당되는 모듈은?

① urllib.parse 모듈 ② urllib.request 모듈 ③ http,client 모듈 ④ http.server 모듈

 

 

20. URL의 분해, 조립, 변경 및 문자 인코딩, 디코딩 등을 처리하는 함수를 제공하는 모듈 은?

① urllib.parse 모듈 ② urllib.request 모듈 ③ http.client 모듈 ④ baseHTTPServer 모듈

 

 

21. HTTP 프로토콜 요청에 대한 저수준의 더 세밀한 기능이 필요할 때 사용하는 모듈은?

① urllib.parse 모듈 ② urllib.request 모듈 ③ http,client 모듈 ④ http.server 모듈

 

 

22. 웹 서버용 파이썬 라이브러리 주요 클래스 중 웹 서버를 만들기 위한 클래스로,

서버 IP 와 PORT를 바인딩하는 클래스는?

① HTTPServer ② SimpleHTTPHendler ③ CGIHTTPHendler ④ BaseHTTPServer

 

 

23. 웹 서버용 파이썬 라이브러리 주요 클래스 중 핸들러를 만들기 위한 기반 클래스로,

HTTP 프로토콜 처리 로직이 들어있는 클래스는?

① HTTPReqiestServer ② SimpleHTTPRequestHendler ③ CGIHTTPRequestHendler ④ BaseHTTPReauestHandler

 

 

24. 우리가 원하는 웹 서버를 만들기 위해서는 기반 클래스를 임포트하거나 상속받아야 하 는데 기반이 되는 클래스는?

① HTTPServer ② SimpleHTTPRequestHendler ③ CGIHTTPRequestHendler ④ BaseHTTPReauestHandler

 

 

25. do_POST() 메서드가 정의되어 있어서 POST 방식을 처리할 수 있는 클래스는?

① HTTPServer ② SteamRequestHendler ③ CGIHTTPRequestHendler ④ BaseHTTPReauestHandler

 

 

26. 파이썬 웹 프레임워크는 WSGI 서버를 제공하여 애플리케이션 개발자가

웹 서버 개발시 독립적으로 애플리케이션을 작성할 할 수 있어 생산성을 높일 수 있다.

WSGI 애플리케이션 의 처리 순서에서 WSGI서버가 처리하는 과정이 아닌 것은?

① 뷰 처리, HTTPRequest 객체 생성 ② WSGIScriptAlias에 정의된 wsgi.py ③ application 함수 호출 ④ 표준 출력(stdout)에 결과 출력

✻ 뷰 처리, HTTPRequest 객체 생성은 application에서 처리함

 

 

27. 변수값의 모든 문자를 소문자로 바꿔주는 표현코자 할 경우 템플릿 필터는?

① {{ name | lower }} ② {{ name | upper }} ③ {{ text | escape }} ④ {{ text | striptags}}

 

 

28. 변수 값 중에서 특수문자를 이스케이프해주고, 그 결과 스트일에 HTML 태그를 붙 여주는 템플릿 필터는?

① {{ text | lower | linebreaks }} ② {{ text | escape | linebreaks }} ③ {{ text | escape | join }} ④ {{ text | escape | striptags}}

 

 

29. value 변수값에서 HTML 태그를 모두 없애고 표현하는 템플릿 필터는?

① {{ value | lower }} ② {{ value | upper }} ③ {{ value | escape }} ④ {{ value | striptags}}

 

 

30. value 변수값이 1이 아니면 복수 접미사 s를 붙여 표현하는 템플릿 필터는?

① {{ value | escape }} ② {{ value | upper }} ③ {{ value | pluralize }} ④ {{ value | striptags}}

 

 

31. 다음 중 템플릿 태그로 특정 값을 변수에 저장해두는 기능 태그는?

① {% for %} ② {% if %} ③ {% with %} ④ {% url %}

 

 

32. 다음 중 템플릿 태그로 사용자 정의 태그 및 필터를 로딩해주는 태그는?

① {% for %} ② {% url %} ③ {% with %} ④ {% load %}

 

 

33. 다음 중 템플릿 코드에서 "Hello!!" 만 출력되는 것은 ?

① Hello!! ② {# {% if foo %} #} Hello !! ③ {# {% hello!! %} Hello !! #} ④ {% url %} {# Hello!! #}

'학교 > DJANGO' 카테고리의 다른 글

Django 중간고사 대비 정리  (1) 2024.04.21
Django CRUD 생성  (0) 2023.12.18
Django 기말시험대비정리  (0) 2023.12.18