본문 바로가기
개발

[Django] sns - 앱 초기화

by 마스터누누 2017. 6. 29.
728x90
반응형

 sns - 앱 초기화




다시 새로운 어플리케이션을 만들어보자.

이번에는 sns를 구현하면서 로그인/로그아웃 기능을 중점적으로 다루어볼 것이다.

또한 이미지 업로드 기능도 사용해 보도록하자.





먼저 새로운 프로젝트를 만들기 위해서

$django-admin startproject mysite를 콘솔창에 입력해주자


다음으로 어플리케이션을 만들어야하는데

$python manage.py startapp kilogram을 입력한다.

이렇게 만들어진 어플리케이션은 settings.py에 어플 이름으로 등록한다.







또한 LANGUAGE_CODE='ko-kr',  TIMEZONE = 'Asia/Seoul'을 변경해주고

정적 파일 사용을 위해 STATIC_ROOT = os.path.join(BASE_DIR,'stiatic')을 추가한다.


작업이 끝났으면 관리자 페이지의 관리자 계정을 만들어준다.

$python manage.py createsuperuser 명령어를 콘솔창에 입력하면 된다.





1
2
3
4
5
6
7
8
9
from django.conf.urls import url
from django.contrib import admin
from . import views
 
app_name ='kilogram'
 
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name = 'index'),
]
cs


이번에는 url을 include 방식으로 적용해볼것이다.

따라서 kilogram 디렉토리 안에 urls.py를 생성한다.


상단에 app_name을 지정하면 다른 어플리케이션과 충돌하지 않는 네임스페이스가 생성된다.

그리고 url에 기존방식과 다르게 views.IndexView.as_view()가 사용되었는데,

이는 views 내부로 접근할 때 함수가 아니라 클래스로 접근한다는 뜻이다.

따라서 function_based view가 아니라 generic view로 접근한다.





1
2
3
4
5
6
7
8
9
from django.conf.urls import url, include
from django.contrib import admin
from kilogram import views as kilogram_views
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', kilogram_views.IndexView.as_view(), name = 'root'),
    url(r'^kilogram/', include('kilogram.urls')),
]
cs


마찬가지로 이 경로에 접근하기 위해서 mysite의 url도 지정 해줘야한다.

kilogram으로 접근했을 때 kilogram.urls 파일로 연결시켜주며 이를 위해서 include 함수가 사용된다.

include 함수를 사용하기 위해서는 반드시 from django.conf.urls import include의 명시가 필요하다.


그리고 일반적인 localhost:8000번으로 접근했을때도 kilogram 앱으로 연결시켜주기 위해서 url을 추가한다.

이를 위해서 kilogram의 views를 추가해야하는데 다른 어플리케이션과의 충돌을 피하기 위해 

as 키워드로 kilogram_views라는 별칭을 만든다.





1
2
3
4
5
from django.shortcuts import render, redirect
from django.views.generic.base import TemplateView
 
class IndexView(TemplateView):
    template_name = 'kilogram/index.html'
cs


url이 다 수정되었으므로 views를 수정해야한다.

generic view로 설정했으므로 IndexView라는 클래스를 만든다.

이 클래스는 템플릿을 그냥 그대로 보여주는 기능만 하기 때문에 

from django.views.generic.base import TemplateView를 추가하여 상속받아 사용한다.


그리고 template_name을 지정해주면 해당 템플릿이 출력된다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
  <title>Kilogram</title>
 
  <!-- Bootstrap -->
  <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
 
  {% load static %}
  <link rel="stylesheet" type="text/css" href="{% static 'kilogram/style.css' %}" />
 
  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body>
  <nav class="navbar navbar-default navbar-static-top">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="{% url 'kilogram:index' %}"> <span class="glyphicon glyphicon-camera"> </span> Kilogram </a>
    </div>
    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse">
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#"> <span class="glyphicon glyphicon-user"></span> Login</a></li>
        <li><a href="#">Logout</a></li>
        <li><a href="{% url 'admin:index' %}">Admin</a></li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
  <div class="container">
    <div>
      {% block content %}
      {% endblock %}
    </div>
  </div>
  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <!-- Include all compiled plugins (below), or include individual files as needed -->
  <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
cs


템플릿은 항상 해당 앱 내부에 templates/앱 이름/ 아래 넣어줘야한다.

이 앱에서는 templates/kilogram/~~~.html을 넣어주면 된다.


우선 모든 페이지의 base가 되는 base.html을 생성해주자.

base.html을 위의 네비게이션 바를 만드는 것이고,

이것을 베이스로 모든 템플릿을 생성할 것이다.





1
2
3
4
5
6
{% extends 'kilogram/base.html' %}
{% block content %}
 
<h1>Kilogram Main Page</h1>
 
{% endblock %}
cs


따라서 base.html을 extends하여 만든 index.html은

위와 같이 간단하게 만들어 질 수 있다.




출처 : 인프런, 파이썬 웹 프로그래밍, Django로 웹 서비스 개발하기


반응형

'개발' 카테고리의 다른 글

[Django] sns - 사용자 등록 구현  (0) 2017.06.30
[Django] sns - 로그인과 로그아웃 구현하기  (0) 2017.06.30
[Django] lotto - 앱 다듬기  (0) 2017.06.28
[Django] lotto - POST 처리  (0) 2017.06.28
[Django] lotto - form 만들기  (0) 2017.06.28

댓글