사이트 참고 : https://tutorial.djangogirls.org/ko/django_installation/
* 장고는 앱을 설치하여 운용한다.
앱 설치시, settings.py -> INSTALLED_APPS 목록에 추가해줘야 한다.
1. 가상환경 구성
- 가상환경 구성하여 개발 테스트
- cmd -> 가상환경 구성할 디렉토리로 이동
- python -m venv 폴더명 : 가상환경에 사용할 폴더생성 및 설치됨
- cd 폴더명\Scripts 로 이동
- activate 입력 후 엔터 -> cmd 앞에 (폴더명)이 적혀있다면 가상환경이 실행됨을 알수 있음
- django 설치
- cmd 에서 pip install django 입력 후 엔터 -> 설치 진행함
- django rest framework 설치
- cmd 에서 pip install djangorestframework 입력 후 엔터 -> 설치 진행함
- settings.py -> INSTALL_APPS 에 'rest_framework' 추가
- cmd 에서 django-admin.py startproject 사이트명(예:mysite) .
2. 웹서버 실행
- cmd 에서 manage.py 가 있는 폴더로 이동
- cmd 에서 python manage.py runserver 0.0.0.0:포트번호 입력 후 엔터 -> 웹서버 실행
3. 장고에서 사용하는 파일들 설명
3.1. manage.py
- 사이트 관리를 도와주는 역할. 웹서버 시작 할 수 있는 역할
- 위치 : 프로젝트 폴더
3.2. settings.py
- 웹사이트 설정이 있는 파일
- 설치된 앱이 있다면, INSTALL_APPS 에 추가해줘야 함.
- DEBUG = True 로 설정시, 오류 발생하면 웹페이지에 로그를 찍어줌
- ALLOWED_HOSTS = []
- 접속을 허락할 호스트 리스트. ['*'] 로 설정시 모두 받아준다는 의미
- TIME_ZONE : 타임존. 'Asia/Seoul'
- 정적파일 경로 추가
- STATIC_URL = '/static/'
- STATIC_ROOT = os.path.join(BASE_DIR, 'static')
- 위치 : 프로젝트 폴더
3.3. urls.py
- 입력 url 패턴에 따른 동작 함수 호출하는 역할
- 프로젝트 폴더에 있는 파일은, 각 앱 명칭에 있는 파일로 리다이렉트 코드 추가 및 admin url 처리
- views.py 함수 호출
- 위치 : 프로젝트 폴더, 각 앱 명칭 폴더 내
- 작성 방법 참조 : https://wikidocs.net/9649
3.4. models.py
- 로직 구현을 위한 클래스 및 맴버변수, 함수 생성
- DB와 연동
- 위치 : 각 앱 명칭 폴더 내
3.5. admin.py
- models.py 에서 정의한 클래스 등록
- 위치 : 각 앱 명칭 폴더 내
3.6. views.py
- urls.py 에서 여기에 정의한 함수 호출
- models.py 에 정의한 클래스 데이터를 활용
- template 에 처리 결과 데이터 전달
- 위치 : 각 앱 명칭 폴더 내
3.7. template (html)
- views.py 에서 처리한 데이터를 화면에 표시
- 위치 : 각 앱 명칭 폴더/templates/각 앱 명칭 폴더/파일명.html
3.8. 정적파일
- css, 이미지 등 모든 사용자에게 동일하게 보여주는 파일들
- css 위치 : 각 앱 명칭 폴더/static/css/파일명.css
- 이미지 위치 : 각 앱 명칭 폴더/static/images/파일
3.9. forms.py
- 사용자 입력 인터페이스
- ModelForm을 생성해 자동으로 모델에 결과물을 저장
- 위치 : 각 앱 명칭 폴더
4. 데이터베이스 생성
- 장고 모델과 데이터베이스가 연동됨
- 모델에서 클래스 생성시, 클래스명(models.Model): 이라고 작성해야 함
- 3.2. settings.py와 연결됨
- DATABASES 항목에 이미 sqlite3 가 설정되어 있음
- 'NAME' 항목의 BASE_DIR 다음항목이 db 파일 이름임. 기본값 'db.sqlite3' 로 되어 있음
- cmd에서 manage.py가 있는 위치로 이동 -> python manage.py migrate 입력 후 엔터시 db 생성
5. 어플리케이션 생성
- cmd에서 manage.py가 있는 위치로 이동
- python manage.py startapp 앱 명칭 입력 후 엔터
-> 앱명칭 폴더 및 파일들이 생성된다.
- settings.py 파일 -> INSTALLED_APPS에 앱 명칭을 추가해준다.
-> '' 로 감싸여 있어야 하며, 다른 항목과 구분하기 위해 , 를 사용한다.
6. 장고 모델
- 클래스 개념
- DB와 연동되어 저장된다.
- 모델에서 클래스 생성시, 클래스명(models.Model): 이라고 작성해야 연동되어 저장됨
- models.py에 모델 객체를 작성
- 문장 끝에 세미콜론을 쓰지 않는다.
- 대괄호 대신 :를 사용하여 열고, 닫는것은 없다.
- using문
- from 위치 import 클래스명
- 예 : from django.db import models
6.1. 클래스
- 생성법 (첫글자는 항상 대문자)
- class 클래스명(models.Model) :
- 맴버변수
- 맴버변수명 = models(import한 db 클래스).TextField() //db 에 연동할 컬럼속성을 설정한다. textfield는 예 이다. 자세한건 하단 설명서 참조
- 메소드 (소문자와 _의 조합으로 작성)
- 클래스 메소드
- def 메소드명(인자값): 으로 선언 후 할일을 코딩한다.
- 예 : def publish(self): self.save()
- 특수 메소드
- 메소드명 앞뒤로 언더바 두개 __ 가 붙는다.
- def __init__, __str__ 등등
- 함수 인자값은 필요에따라 변경하여 코딩 가능
- 참조 : https://codeonweb.com/entry/1cab851f-da6a-4ce5-892b-513d84c53f3b
- 장고 모델 작성 설명서 : https://docs.djangoproject.com/en/2.0/ref/models/fields/#field-types
6.2. 모델 작성후 DB 테이블 생성
- cmd 에서 manage.py 위치로 이동
- python manage.py makemigrations 앱 명칭 입력 후 엔터
-> 앱 명칭에 있는 모델 정보를 데이터베이스에 반영할 수 있는 마이그레이션 파일 생성
- cmd 에서 python manage.py migrate 앱 명칭 입력 후 엔터
6.3. 모델 추가
- 7. Admin 에서 설명
7. Admin (모델추가)
- 관리자 화면을 한국어로 바꾸고 싶을경우, settings.py -> LANGUAGE_CODE의 en-us를 ko 로 변경
- 앱 명칭 폴더 -> admin.py 열기
- from .models import 클래스명 코드 추가
- admin.site.register(클래스명) 코드 추가
- cmd 에서 manage.py 위치로 이동
- python manage.py createsuperuser 입력 후 엔터
- 유저명, 이메일, 비밀번호 입력
- 서버 실행 명령어 입력하여 실행 후 테스트 (2. 웹서버 실행 참조)
- 참조 : https://docs.djangoproject.com/en/2.0/ref/contrib/admin/
8. 장고
- html 에서 {% %} 사용시, 장고 템플릿 태그를 의미함
- 프로젝트 생성 -> 각 화면 혹은 기능별 어플리케이션을 생성하여 개별적으로 작업
- 각 역할별 폴더명 및 위치가 정해져 있음 (template, css..)
8.0. 장고 개발 및 동작 순서
- 간단 설명 : models.py 에 클래스, 맴버변수, 함수 정의 -> url 입력 -> urls.py 에서 입력한 url 유형 판단 -> views.py 에 정의한 함수 호출
-> models.py에서 정의한 클래스를 활용하여 적절한 작업 -> template인 html 에 데이터 전달 -> 전달받은 데이터를 이용하여 화면에 표시
8.0.1. 모델 생성 (클래스 생성)
- models.py 에 클래스 및 맴버변수, 함수 생성
- 6. 장고 모델 참조
8.0.2. view 작성
- views.py 에 models.py 에서 정의한 클래스 임포트
- 8.0.3. 에서 명시한 url 에서 view 함수를 호출함
- 동작할 함수를 생성하여, 안에 동작 로직 코딩
- 후에 설명할, template 에 로직 결과물을 전달하여 화면에 보여주게 함
- 8.2. 장고 뷰 참조
8.0.3. url 작성
- urls.py 에 입력받는 url의 유형별 8.0.2. 에서 작성한 뷰 의 함수호출 코드 작성
- 8.1. 장고 뷰 참조
8.0.4. html 작성 (template)
- html로 이루어 져 있음
- view 로부터 전달받은 데이터를 화면에 보여주는 역할
- {% %} 를 이용하여 장고 함수들을 사용할 수 있음. (if문, 반복문, 클래스 맴버변수 접근 등)
- 8.3. 장고 뷰 참조
8.1. 장고 url
- 참조 : https://docs.djangoproject.com/en/2.0/topics/http/urls/
- 작성 방법 참조(정규식 등) : https://wikidocs.net/9649
- 사용자가 url 입력시 맞는 내용을 보여주기 위한 설정.
- urls.py 파일에서 설정
- 메인프로젝트의 urls.py 에서 앱의 urls.py 포함하여 url 찾기
- from django.urls import path 에 include 추가 => from django.urls import path, include
- uripatterns 에 다음을 추가
- path('',include('앱명칭.urls')),
- 공백인 ''를 넣었기에, 모든 요청을 앱명칭.urls에서 찾는다.
- 앱명칭 폴더 -> urls.py 파일을 새로 생성
- 생성한 파일에 다음의 코드 추가
* 숫자 정규식을 쓸경우, 1자리수 이상을 위해 +를 붙인다. 하단 예제는 정규식을 사용치 않은 예제
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'), // 모든 요청에 대해 views.py 에 명시된 post_list 함수 호출
path('post/<int:pk>/',views.post_detail,name='post_detail'), //post/숫자/ 형태의 경우 views.py 에 명시된 post_detail 함수 호출 <int:pk> 는 숫자가 올것이고, pk변수에 담음
]
8.1.1. urlpatterns 연동
- path를 이용하여 url 패턴 리스트를 추가함.
- 사용자가 url을 직접 입력했을 경우
- 등록된 urlpatterns 리스트 중, path의 첫번째 인자값과 일치하는 항목을 찾음 -> 그에 해당하는 view의 함수를 호출함
- template 인 html 에서 특정 상호 작용시
- html에 작성된 "{% url '특정이름' %}" 에서 '특정 이름' 을 urlpatterns 리스트의 path 마지막 인자값인 name과 일치하는 항목을 찾음 -> 그에 해당하는 view의 함수를 호출
8.2. 장고 뷰
- 참조 : https://docs.djangoproject.com/en/2.0/topics/http/views/
- 로직을 넣는곳으로, 모델에서 필요한 정보를 받아온 후 템플릿에 전달
- views.py에 있음
- urls 에서 뷰로 내용전달 -> 뷰 에서 템플릿인 html로 전달 함으로서 화면에 보여지게 됨.
- 예
def post_list(request):
objectitems = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/test.html' ,{'objectitems':objectitems})
// request 가 왔을경우 html 파일을 render 하여 리턴
// 실제 html 파일은 앱명칭 폴더명/templates/앱명칭 폴더명 안에 존재해야 함
// {} 안에는 템플릿에 전달하는 부분으로, 8.4.7 참조
// {'매개변수명',매개변수명} 으로 작성하며, 템플릿에서 명시한 매개변수명과 일치해야 함
// Post 는 from .models import Post으로, models.py 에서 정의한 클래스 명
def post_detail(request,pk):
post = get_object_or_404(Post,pk=pk)
return render(request, 'blog/test_detail.html', {'post':post})
//from django.shortcuts import render, get_object_or_404 참조 추가하여, 404에러를 가져오거나, 조회된 오브젝트를 가져옴
8.3. 템플릿
- 참조 : https://tutorial.djangogirls.org/ko/html/
- html 형태
- 위치는 앱명칭/templates/앱명칭 폴더 안에 생성해야 함
8.3.1. 동적으로 파이썬에서 생성된 매개변수 접근 (model 에서 선언한 클래스를 담은 매개변수. views.py에서 전달)
- {{매개변수명}} 을 통해 매개변수에 접근함
- html에 이렇게만 적어놓을 경우, <QuerySet [<Post: dddd>]> 이런식으로 쿼리결과가 보여짐
8.3.1.1. html에서 반복문
- {% for 임시변수명 in 전달받을 매개변수명 %}
{{임시변수명}} 혹은 {{임시변수명.맴버변수명}}
{% endfor %}
- 예 :
<html>
<header>
<title>test page</title>
</header>
<body>
{% for objectitem in objectitems %}
<p>author : {{objectitem.author.username}}</p>
<p>title : {{objectitem.title}} </p>
<p>text : {{objectitem.text|linebreaksbr}}</p>
{% endfor %}
</body>
</html>
8.3.2. 템플릿 확장
- 동일한 양식의 템플릿을 다른 html에서 공통적으로 사용
- 변경할 일이 있을경우, 하나의 html만 수정하면 됨
- 사용법
- base.html 에서, 변동적으로 그려줄 부분에
{% block content %}
{% endblock %} 을 적어준다.
- 내용을 채워줄 html에는 모든내용을 지우고,
{% block content %}
{% endblock %} 사이에 코드를 삽입한다.
- 기본 html을 연결한다
- {% extends '앱 명칭/base.html' %}
//base.html 예
<body>
<div class="page-header">
<h1><a href="/">Django Girls Blog</a></h1>
</div>
<div class="content container">
<div class="row">
<div class="col-md-8">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
// 확장 html 사용 html 예
{% extends './base.html' %} // 같은 폴더에 있을경우 ./
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}
8.4. 쿼리셋
- 참조 : https://tutorial.djangogirls.org/ko/django_orm/
- https://docs.djangoproject.com/en/2.0/ref/models/querysets/
- https://brownbears.tistory.com/63
- 데이터베이스로부터 데이터를 읽음. 필터 및 정렬 가능
- cmd 에서 python shell 입력후 엔터 -> 직접 타이핑 하여 조회 가능하고, views.py 코드에서도 같은방식으로 조회 가능
8.4.1. all()
- 조회할 테이블명.objects.all()
- 해당 테이블에 있는 모든 항목 조회 출력
8.4.2. create()
- 입력할 테이블명.objects.create(필드명=값,필드명=값....)
- db에 입력. 텍스트의 경우 ''로 감싸줘야 함
- 유저를 값으로 쓸 경우, 유저 테이블에서 조회, 해당 결과값을 변수에 저장 후 넣어야 한다.
8.4.3. get()
- 조회할 테이블명.objects.get(필드명=값)
- 해당 조건에 맞는 항목을 가져온다.
- 변수=조회할 테이블명.objects.get(필드명=값) 을 하게되면, 변수에 할당한다.
8.4.4. 필터링
8.4.4.1. 동등 조건
- 조회할 테이블명.objects.filter(필드명=값)
8.4.4.2. 연산자 필터 (예 : contains)
- 조회할 테이블명.objects.filter(필드명__contains='값')
- 연산자필터를 사용하기 위해서는 언더바 2개 사용
8.3.5. 정렬
8.4.5.1. 오름차순
- 테이블명.objects.order_by('컬럼명')
8.4.5.2. 내림차순
- 테이블명.objects.order_by('-컬럼명')
8.4.6. 다중 쿼리셋
- .을 이용하여 다중 쿼리셋 구현
- 테이블명.objects.filter(컬럼명=값).order_by('컬럼명')
8.4.7. 코드에서 사용 후 템플릿에 전달
- return render에서 마지막 인자인 {} 안에 작성
- {'매개변수명':매개변수명}
- 예 : return render(request,'blog/test.html',{'objectitems':objectitems})
- 8.3.1. 템플릿 참조하여 해당 매개변수를 템플릿에 표시하는 방법 참조
8.5. 정적파일
- css와 이미지파일
- 요청내용에 따라 바뀌지 않고 모든 사용자가 동일한 내용을 봄
- 위치
- 앱 명칭폴더/static/css/앱명칭.css
- html 에서 로드
- 맨 처음줄에 {% load static %} 추가 (html 태그 앞)
- head 태그 안에 <link rel="stylesheet" href="{% static 'css/앱명칭.css' %}">
8.6. 폼 (Form)
- 사용자가 데이터를 전송하는 인터페이스
- 하나 이상의 위젯으로 만들어 짐 (텍스트 필드, 버튼, 체크박스 등등)
- modelform을 생성하여 자동으로 모델에 결과물을 저장할 수 있음
- urls , views, template(html) 모두 설정 및 추가 해주어야 함
8.6.1. 클래스 생성
- model과 마찬가지로 클래스를 생성함
- 예
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'text',)
// PostForm 은 원하는대로 변경 가능한 클래스명
// forms.ModelForm 은 필수
// 내부에 Meta 클래스 또한 필수로, 생성할 폼과 연결할 모델을 지정
// fields 는 Post의 맴버변수 중, 어느 항목에 대한 폼을 생성할지 설정 (여기서는 타이틀과 본문내용 입력 폼 생성)// 두 항목이 모두 문자열 필드 이므로 문자열 입력 폼이 생성될 것임
8.6.1.1. html 속성 설정
- 폼 클래스 생성시, html 태그의 class 등 속성을 설정 할 수 있음.
- 예
class Form클래스명(forms.ModelForm):
class Meta:
model = 모델클래스명
fields = ("모델필드명",)
widgets = {'모델필드명':forms.Textarea(attrs={'어트리뷰트명':'값'}),}
8.6.2. view 와 연동
- views.py 에 from . forms import forms.py에 등록한 클래스명
- 동작을 원하는 함수 추가
- 변수 = forms.py에 등록한 클래스명() 을 통해 폼을 생성하여 변수에 저장
- template 에 해당 변수 전달
8.6.3. template(html) 와 연동
- {{ 변수명 }} 을 통해 전달받은 폼 변수 접근
- <form> 태그 안에 변수를 사용해야 함
- <form> 뒤에 {% csrf_token %} 를 반드시 붙여야 함 : <form>{% csrf_token %} (보안관련)
8.6.3.1. 장고 form의 렌더링 옵션
- {{ 변수명 }} 을 통해 전달받은 폼 변수에서 랜더링 옵션이 사용 가능함
- 폼을 해당 옵션에 맞추어 태그 생성하여 보여줌.
- 예 : {{ 변수명.as_p }}
- 폼을 p태그를 붙여 표시함
- as_p : p 태그
- as_table : 테이블 태그
- as_ul : ul 태그 등등....
- 참조 : https://docs.djangoproject.com/en/2.2/ref/forms/api/ 중간부분부터
8.6.4. 사용자 입력항목 저장
- template (html) 의 <foam> 태그도 변경 필요
- 8.6.2. 에 이어, views.py 에서 추가 작업 필요
- 폼 입력화면 최조 접속시, 입력 후 저장 버튼 클릭시 에도 모두 동일한 함수가 호출됨
- 따라서, 각 상황에 맞게 구분하여, 저장버튼 클릭시에는 실제로 데이터가 저장될 수 있도록 코딩 해야 함.
- form클래스.is_valid() 를 통해 모든 항목이 맞게 입력되었는지 검증 필요
8.6.4.1. 상황 구분 (작성 후 저장상황)
- if request.method == "POST" 이라면, 저장해야 하는 상황
8.6.4.2. form클래스에서 바로 저장
- form변수명 = forms.py에서 정의한 클래스명(request.Post) 를 통해 생성한 form변수명.save() 를 이용해 바로 저장
8.6.4.3. models클래스에서 저장
- form클래스에 입력하지 않은 입력사항들을 포함하여 저장할 필요가 있을경우에 사용
- form클래스 생성시, Meta클래스 -> model = 실제 models.py 클래스 를 하였으므로, form클래스에서도 models클래스의 맴버변수 접근 가능
- 예
if form.is_valid(): //맞게 입력되었는지 검증
post = form.save(commit=False) //form 에 입력된 내용은 db에 커밋하지 않고, Meta 클래스 -> model 변수에 배정한 클래스 형태로 리턴받음
post.author = request.user
post.published_date = timezone.now()
post.save()
- 전체 예
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect('post_detail', pk=post.pk) //다른곳으로 리다이렉트. 사용을 위해선 from django.shortcuts import redirect 추가
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
8.6.4.4. template(html) <form> 태그
- 기존 <form>{% csrf_token %} 를 => <form method="POST">{% csrf_token %} 으로 변경
- 8.6.4.3. 에서 views.py 에서 새로 작성인지, 작성완료인지 구분을 하는 구분자가 request.POST 이므로 method에 POST를 지정해줘야 함
8.6.5. 저장항목 수정
- 8.6.4. 와 비슷
- 수정버튼 클릭을 통한 최초 접근일 경우, 인자로 넘겨받은 데이터를 form 양식에 채워 보여줘야 함
- 저장버튼 클릭시, 즉 method=POST 인 경우에도 동일한 함수가 호출되므로, if문 예외처리 후 저장 동작 수행
- template, urls, views 수정 필요
- template에서는 url 호출 코드 추가. pk값 인자값으로 전달
- urls 에서는 views 함수 호출
- views 함수 에서는 받은 인자값을 통해 데이터 수집 및 template 에 전달
8.6.5.1. Views.py 함수
- models.py 에서 작성한 class 변수를 생성하기 위해 기존에는 다음의 코드를 사용하였음
- 예 : form = PostForm(request.POST)
=> PostForm을 새로 생성하는데, 안에 값을 채워넣어 생성하는 방식.
- form = PostForm() 으로 할 경우, 맴버변수 값이 없는 형태로 생성
- form = PostForm(request.POST, instance=post) 를 사용해야함
=> 인스턴스로 가져옴.
- 전체 예
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == "POST":
form = PostForm(request.POST, instance=post)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.published_date = timezone.now()
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm(instance=post)
return render(request, 'blog/post_edit.html', {'form': form})
8.6.6. 저장항목 삭제
- template, urls, views 수정 필요
- views.py 에 작성한 함수에, 변수명.delete() 하면 삭제됨.
- 예 : post.delete()
8.7. 보안
- 사용자 별 보여지는 항목이 다르게 할 필요가 있음.
- {% if user.is_authenticated %} {% endif %} 사이에 원하는 html태그를 넣을경우, 인증받은 사용자 에게만 해당 태그가 보임
8.7.1. 사용자 로그인
- 참조 : https://wikidocs.net/6650#_6
- views.py 상단에 from django.contrib.auth.decorators import login_required 추가
- 로그인 필요 기능에 대해, views.py 에 정의한 함수 상단에 @login_required 작성
- 8.7.1.1. 프로젝트의 urls.py
- 앱 명칭/urls.py가 아닌, 프로젝트의 urls.py 에 추가
- 상단 from django.conf.urls import url 및 from django.contrib.auth import views 추가
- 'accounts/login/' url이 왔을경우, views.LoginView.as_view()호출, name = login
- url(r'^accounts/login/',views.LoginView.as_view(),name='login'),
- 8.7.1.2. 로그인 템플릿 생성
- 앱명칭/templates/registration 폴더 생성
- 안에 login.html 생성
{% extends "blog/base.html" %}
{% block content %}
{% if form.errors %}
<p>이름과 비밀번호가 일치하지 않습니다. 다시 시도해주세요.</p>
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}
- 8.7.1.3. settings.py
- LOGIN_REDIRECT_URL = '/' 항목 추가
- LOGIN_URL = '/accounts/login/' 항목 추가
8.7.2. 사용자 로그아웃
- 8.7.2.1. 프로젝트의 urls.py
- url(r'^accounts/logout/$',views.LogoutView.as_view(next_page='/'), name='logout'), 추가
- next_page : 다음으로 이동할 페이지
- 8.7.2.2. template(html) 수정
- url의 logout 을 호출
- <a href="{% url 'logout'%}">logout</a>
9. 파이썬
- 들여쓰기가 중요함. 여타 프로그램 언어와 달리 {} 가 없이 들여쓰기로 이를 판단함.
- 스페이스와 탭을 혼용하여 들여쓰기 하면 안됨
- 함수, 조건문 등 {를 써야 하는 상황에 : 를 사용하고, 닫는 문자열은 없음
- ; 처럼 문장 종결 문자열도 없음
9.1. 문자열 취급
- ' 또는 " 로 감싸 있어야 함
- 문자열에도 * 연산자가 사용가능. "abc" * 3 할경우 "abcabcabc"가 됨
9.2. 숫자 -> 문자열 전환
- str(숫자)
- 반대로 문자열 -> 정수 전환은 int(문자열)
9.3. print()
- 콘솔에 인자값을 출력하는 함수. 리스트도 변수만 넣으면 알아서 출력
9.4. List
- [] 로 구성. 예 : item = [1,2,4,3,5,9]
- 오름차순 정렬 : sort()
- 내림차순 정렬 : reverse()
- 추가 : append()
- 특정위치 삭제 : pop(인덱스)
9.5. Dictionary
- {} 로 구성. 예 : item = {'first':1,'second':2,'third':4,'forth':3,'fifth':[1,2,3]}
9.6. and , or
- and 연산자는 글자 그대로 and 라고 적음
- or 또한 or 라고 적음
9.7. 조건문
- if elif else 로 사용
9.8. 주석
- # 을 사용
9.9. 반복문
- for 임시변수명 in 반복할변수명:
- for i in range(시작숫자,끝숫자):
=> 시작숫자 ~ 끝숫자 -1 까지 동작
=> range(0,10) : 0 ~ 9까지
10. 배포 하기 (Git 저장소와 연동)
- Git은 사용중이므로 소스코드 업로드 하는것은 작성치 않음.
- 웹서버에 git을 연동하여, 소스코드를 업로드 하면 자동으로 갱신하여 반영하도록 하는것이 목적.
10.1. AWS 사용 (개발용 runserver)
- AWS 가입 및 설정 참조 : https://nachwon.github.io/django-deploy-1-aws/
- http://recordingbetter.com/django/2017/06/29/Django-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-AWS%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-(%EC%A0%84%EC%B2%B4)
- settings.py 의 ALLOWED_HOST 에 '.ap-northeast-2.compute.amazonaws.com' 추가
- 웹서버 console 에 진입 (xshell 등)
- 1. 가상환경 구성을 참조하여 가상환경 구성 및 장고, rest framework 설치
- srv 폴더의 소유자 등 권한 변경
- scp 명령어를 통해 소스코드 업로드 (로컬pc에 있는 파일들을 aws로 업로드함)
- scp -i aws키페이경로 -4 보낼폴더경로 유저명@dns:받을폴더경로
- runserver 실행
- ./manage.py runserver 0:8080
- 상세내용은 링크 참조
10.2. AWS 에서 WSGI 를 이용한 웹서버 사용 (실제 배포)
- 실제 배포를 위해서는 WSGI를 설치해야 함. 파이선 프레임워크
- uWSGI 사용
- AWS 콘솔 연결 (xshell 등)
- 배포에 사용할 유저 추가
- sudo adduser deploy
- uWSGI를 설치할 가상 python 환경 생성
- pyenv virtualenv uwsgi-env
- 서버 전체에서 하나의 uwsgi를 사용하는 설정
- pyenv shell uwsgi-env
- 가상환경에 uwsgi 설치
- pip install uwsgi
10.2.1. uWSGI로 서버 열기
uwsgi \
--http :포트번호 \
--home virtualenv 경로 \
--chdir 장고프로젝트폴더 경로 \
-w wsgi모듈명.wsgi
- 10.2.1.1. ini 파일로 uWSGI 실행하기 (예시)
- 매번 위의 명령어를 실행하기 힘드므로 ini 파일을 생성후 실행
- 참조 : https://nachwon.github.io/django-deploy-2-wsgi/
10.3. AWS S3 사용
- 미디어 등 파일저장위치와 실제 웹페이지를 분리하여 관리하기 위해 사용한다.
- AWS S3 설정 참조 : hhttps://nachwon.github.io/django-deploy-7-s3/
10.4. Logger 사용
- settings.py ->LOGGING = { ... 'loggers' : { ... } }항목에, 로그를 작성할 앱용 로거를 등록해야함
- 예
'loggers': {
'앱명칭': {
'handlers': ['console'],
'level': 'DEBUG',
},
},
- views.py 에서, import logging 추가
- logger = logging.getLogger(__name__) 을 바로 아랫줄에 추가
- 사용할 곳에서 logger.info('문자열') 등으로 사용
'Backend > Django' 카테고리의 다른 글
초기세팅 (0) | 2023.12.18 |
---|---|
SSL 세팅 (0) | 2023.10.18 |
도커 설정 (2) | 2023.10.18 |
Django 초기 세팅 및 주요 플러그인들 (0) | 2023.10.18 |
django rest framework 내용정리 (웹 BackEnd Django 내용정리와 연결) (0) | 2022.03.25 |