python3 -m venv 가상환경이름
django-admin startproject 프로젝트이름 생성될경로
django-admin startproject myweb .
.
은 현위치 python manage.py startapp 애플리케이션이름
python manage.py runserver 외부에서접속할IP:포트번호
- 외부 접속 가능한 IP 설정
- 로컬에서만 접속이 기본 설정- 시간 대역 설정
- 기본 시간 대역이 UTC라 배포할거면 시간 대역 수정 권장- 접속할 수 있는 DB 설정
- 기본 : sqlite3 설정- 애플리케이션 등록
- 애플리케이션을 생성하면 반드시 settings.py 파일에 등록해야 사용가능
python manage.py make migrations
python manage.py migrate
(테이블 생성)__init__.py
파일을 삭제하고 다시 수행하면 됩니다.인증 : 로그인
인가 : 권한
python manage.py migrate
python manage.py createsuperuser
- html 만들어서 전송
- 단순하게 html을 전송
- 서버에서 생성한 데이터와 함께 html을만들어서 전송(Template Engine 이용)
- 데이터만 전송 : 최근에는 이 방식을 선호
- url을 등록 (urls.py)
from django.contrib import admin from django.urls import path #애플리케이션의 views 파일의 내용을 사용할 수 있도록 등록 from 애플리케이션이름 import views urlpatterns = [ path("admin/", admin.site.urls), #localhost:8000 을 web0726의 views.py 파일의 # index 함수가 처리 path("", views.index) ]
- urls.py에 등록된 함수를 생성 (views.py)
from django.shortcuts import render from django.http import HttpResponse #요청을 처리하는 함수의 매개변수는 request #request 객체 안에는 클라이언트에 대한 정보가 저장되어 있음 def index(request): return HttpResponse("<p>Hi Django</p>")
- url을 처리할 함수를 설정 (urls.py)
from django.contrib import admin from django.urls import path #애플리케이션의 views 파일의 내용을 사용할 수 있도록 등록 from web0726 import views urlpatterns = [ path("admin/", admin.site.urls), #localhost:8000 을 web0726의 views.py 파일의 # index 함수가 처리 path("", views.index), #localhost:8000/display 요청이 오면 #views 파일의 display 함수가 처리 path("display", views.display) ]
- 요청을 처리할 함수를 생성 (views.py)
#요청이 오면 templates 디렉토리의 display.html을 출력 def display(request): return render(request, "display.html") =>애플리케이션의 templates 디렉토리에 html 파일을 생성 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML 출력</title> </head> <body> <h2>HTML을 출력합니다.</h2> </body> </html>
- urls.py에 가서 요청을 생성
path("template",views.template) # 앞뒤 맞추는게 기억하기 편함
- views.py에 가서 template 함수를 작성
def template(request): msg = "Hello Template" #HTML에 데이터를 전송하고자 하면 #세번째 매개변수에 디셔너리를 만들어서 #데이터 이름 과 데이터를 기재 return render(request, "template.html", {"msg":msg})
- templates 디렉토리에 template.html 파일을 생성하고 작성
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>데이터:{{msg}}</h3> </body> </html>
서버가 전달해준 데이터를 출력하고자 한다면,
{{ }}
안에 키를 설정하자
{% if 조건 %} 이 사이에 elif, else 사용 가능함 동일한 {% %} 형태 {% endif %}
{% for 임시변수 in 데이터모임 %} 내부 작성 {% endfor %}
둘 다 end를 잊지 말자.
추가로
{{날짜|date:포맷}} : 날짜를 포맷에 맞추어 출력 가능 {{문자열|문자열 메서드}} 가능합니다.
from django.shortcuts import render def template(request): msg="Hello Django Tmeplate" person={"name":"mino", "age":26} data=["mino","mino2","mino3","mino4","mino5","mino6","mino7"] #html에 데이터를 전송하고자 한다면 # 세 번째 변수에 딕셔너리를 만들어서 # 데이터 이름과 데이터를 기재 return render(request, 'template.html', {"msg":msg, "person":person, "data":data})
<body> <h1>안녕하세요?</h1> <h3>제가 약간의 메시지를 적었는데 보실래요?</h3> <br><br> <h4>Data: {{ msg|upper }} msg에 upper 함수를 써봤는데 잘 적용이 되었을까요?</h4> <h4>저는 {{ person.name }} 이고, 나이는 {{ person.age }}살 입니다.</h4> <h4>data라는 변수에 여러 데이터가 들어있는데, 확인하실래요?</h4> <h4> {% if person.age >= 20 %} {{ person.name }}은 성인이구나 {% else %} {{ person.name }}은 미성년자구나 {% endif %} </h4> <h3> {% for temp in data %} <li>{{ temp }}</li> {% endfor %} </h3> </body>
잘 나옴을 알 수 있다.
- CharField
- 문자열 저장에 사용, max_length 속성을 이용해서 최대 길이를 설정
- 파생 클래스(상속을 받은, 하위 클래스)로 EmailField, GenericIPAddressField, CommaSeparatedIntegerField, FilePathField, URLField 등이 존재함(형식이 맞는지 확인)- TextField
- 대용량 문자열- IntegerField
- 정수- BooleanField
- DateTimeField
- DecimalField
- 소수- BinaryField
- UUIDField
- UUID(식별하기 위한 코드)는 숫자와 문자가 섞여있다.
- 64자리나 128자리
- null
- null 허용 여부- blank
- 필수 여부(False 설정 시 필수가 됨)- primary_key
- unique
- default
- db_column으로 컬럼 이름을 속성이름과 다르게 하고자 할 때 사용
pip install mysqlclient
class Item(models.Model): itemID=models.CharField(max_length=50, primary_key=True) itemName=models.CharField(max_length=50) price=models.IntegerField() description=models.CharField(max_length=100) pirctureURL=models.CharField(max_length=200)
애플리케이션_모델이름
형태이다.모델클래스이름.objects().조회메서드
조회 메서드
- all()
- 테이블의 모든 데이터를 조회- get(기본키=값)
- 데이터 1개만 조회- filter(필드이름 연산자 값)
- 조건에 맞는 데이터만 조회- exclude(필드이름 연산자 값)
- 조건에 맞지 않는 데이터만 조회- count()
- 데이터 개수- order_by()
- 정렬할 필드 이름을 나열하는데, 필드 이름 앞에-
를 붙이면 내림차순- distinct(필드이름)
- 필드 중복 제거- fist(), last()
- 첫 번째, 마지막 데이터 조회
insert into myweb_item values('1','레몬',500,'비타민 A', 'lemon.jpg'); insert into myweb_item values('2','오렌지',600,'비타민 B', 'orange.jpg'); insert into myweb_item values('3','포도',700,'비타민 C', 'grape.jpg');
urls.py 파일에 전체 데이터 가져오기 요청을 처리할 코드를 넣어보자.
from myweb import views urlpatterns = [ # admin/요청이 오면 admin.site.urls 함수가 처리하겠다고 남김 path("admin/", admin.site.urls), path("checkDB",views.checkDB) #얼른 views에다가 checkDB를 만들어주자. ]
이건 views.py이다.
from myweb.models import Item def checkDB(request): data=Item.objects.all() print(data)
이렇게만 하면 오류날거야
하지만 보이죠?
웹페이지에서 오류가 안나게 만들려면?
def checkDB(request): dbData=Item.objects.all() print(dbData) return render(request, 'checkDB.html', {"dbData":dbData})
보여줘야 한다.
- http나 https 요청 처리
client가 서버와 연결 가능한지 확인하고 서버에 요청을 전송
서버는 요청을 처리한 뒤에 응답을 전송합니다.
응답이 해제됩니다.
전송방식
- GET
- URL에 파라미터를 붙여서 전송하는 방식
- 자동 재전송이 된다는 장점
- 데이터 크기에 제약이 있고 보안이 취약
- 일반적으로 데이터 크기가 작고 보안이 중요하지 않은 요청에 사용
- "조회"
- 데이터에 숫자나 영문이 아닌 것이 있다면 Encoding 후 전송해야 함
- POST
- 파라미터를 헤더나 바디에 숨겨서 전송하는 방식
- 숨겨서 전송하기에 보안이 GET보다 우수하며, 데이터 크기 제한이 없다.
- 서버에서 Enconding 처리를 하기에, Encoding해서 전송할 필요 없다.
- 일반적으로 삽입, 삭제, 갱신작업에 사용을 합니다.
- 노출되면 안되는 정보 조회를 하는 경우에는 POST를 사용합니다.
- 최근에는 삽입, 삭제, 갱신 작업을 구분하기 위해 삽입은 POST, 수정은 PUT, 삭제는 DELETE 방식으로 요청
- 왜냐면 POST 하나로 여러 작업을 하기에 "어떤 작업을 하는지 명확하지 않기 때문"
Parameter 작성
- GET 방식의 파라미터 작성
- URL뒤에 파라미터를 이름과 함께 작성(파라미터2개 이상일 때 주로이용)
-요청경로?이름=값&이름=값...
-https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=102
이러면 mode, mid, sid1 파라미터가 같이 전송됩니다.
- URL에 파라미터를 포함시키는 경우 - 파라미터가 1개일때
-~~.com/469
- 이 경우는 469가 파라미터입니다.
- url에 포함시켜 전송합니다.
- 상세보기를 구현할 때 많이 이용합니다.
- form을 만들어 데이터를 전송하는 경우는 첫 번째 방법으로 전송됩니다.
- POST 방식의 파라미터 작성
- formdata로 전송하는 방식
- json 형식으로 전송하는 방식
- url에 포함시켜서 파라미터를 전송하는 경우
- urls.py에서 요청 처리 부분을 설정할 때- views.py에서 요청을 처리할 때path('요청경로/<파라미터자료형:파라미터이름>',처리할함수나 클래스)
def 함수이름(request, 파라미터이름): 파라미터이름에 데이터가 저장됨
이렇게 처리됩니다.<a href='detail/{{item.itemID}}'>{{item.itemName}}</a> path('detail/<str:itemID>',views.detail) def detail(request,itemID): ~~~