독립적인 의미를 갖고 있으면 객체로 불러도 좋다. 자동차를 예로 들자? 독립적인 의미를 가질 수 있니? 자동차는 객체로 가질 수 있다. 자동차를 구성하는 구성 요소, 부품들은 독립적인 의미이기 때문에 이것도 객체일 수 있다. 객체들이 모여서 객체가 될 수가 있다.
Mapping : 소프트웨어적인 서로 대응시키는 부분들을 연결(ex : 각 팀 코드 합병)
Matching : 소프트웨어적이 아닌 서로 대응시키는 부분들을 연결(ex : 농구팀 추첨매칭
CRUD를 SQL문(쿼리문) Query문 질의문 등으로 된 것을 알아서 번역해준다.
DB가 이미 Built-In으로 되어있어서 변경되어도 프로젝트를 날릴 위험이 거의 없다.
settings.py
내부의 Databases에 이미 sqllite3
가 설정되어 있음. SQL문법을 필요에 알맞게 변환시켜는 역할을 수행한다.
클라이언트(웹페이지)가 서버로 정보를 전송하기 위한 방법은 form태그를 활용하는 것이 유일하다! (나중엔 틀리지만 지금은 맞다 이게 뭔 말이노)
hover : 마우스를 특정 위치에 올려놓는다는 뜻
form태그에 들어갈 수 있는 요소들 (꼭 form 안에 있지 않아도 독립적 기능 수행 가능) :
input : type
이라는 attribute를 가질 수 있다
name : form태그에 반드시 설정해줘야 하는 attribute!
value : 서버로 전송되는 input 태그의 초기값
text : 텍스트 내용 입력
password : 비밀번호 입력 (내용을 입력하면 알아서 작동 방식이 암호화됨)
radiobox : 라디오 박스 버튼 (중복이 아닌 단일 선택만 가능)
checkbox : 체크박스 버튼 (중복 선택 가능)
placeholder : Default로 text란에 표시되는 내용이나 hover를 하면 바로 사라짐
select : 라디오 박스와 비슷한 기능 수행 (Dropdown 형식으로 속성들 보여줌)
select
밑에 option
태그로 value들을 입력한다.name
은 select
태그에 주고, value
는 option
태그에 부여한다.textarea : text를 여러 줄 입력하고 그것을 눈으로 볼 수 있도록 설계된 큰 창
value
를 부여하면 안된다.rows
, cols
라는 속성을 부여할 수 있다.style
태그로 조정할 수 있다. button : 버튼을 통해 페이지의 동적 변화를 부여할 수 있음
onclick();
이라는 자바스크립트 함수로 attribute를 줄 수 있다.submit
이다.form태그의 Attribute : action
, method
action : 정보를 보낼 곳의 주소, 주소를 입력 안하면 자기 자신한테 보내게 됨.
method : 정보를 보낼 방식, get 방식과 post 방식이 있다.
get : 정보를 url에 붙여서 전송하는 방식
속성을 설정 안하면 get
방식이 Default값이 된다.
정보 보낼 곳의 주소 :
'form요소1이름 = form요소1value & form요소2이름 = form요소2value'
get방식을 사용하는 NAVER는 검색하면서 페이지 이동해도 직전 검색 기록 다 기록중
url은 페이지가 이동하면 주소가 보내고 나서 바뀐다.
post : 정보를 노출되지 않도록 몰래 전송하는 방식
주로 회원가입 할 때 get말고 post로 보내야함! 보안상 이유때문에 그렇다!
페이지 이동해도 url 주소가 변경되지 않는다.
페이지를 다시 뒤로 이동하려고 하면 '양식 확인 알람창'이 뜬다.
<form action="form태그.html" method="post">
인풋 타입 히든 : <input type="hidden" name="input_hidden">
<br>
인풋 타입 텍스트 : <input type="text" name="input_text">
<br>
인풋 타입 패스워드 : <input type="password" name="input_pw">
<br>
인풋 타입 라디오 :
<input type="radio" name="hobby" value="4"> 농구
<input type="radio" name="hobby" value="5"> 축구
<input type="radio" name="hobby" value="6"> 야구
<input type="radio" name="hobby" value="7"> 배구
<br>
인풋 타입 체크박스 :
<input type="checkbox" name="subject" value="8"> 음악
<input type="checkbox" name="subject" value="9"> 미술
<br>
셀렉트 :
<select name="gender">
<option value="m">남성</option>
<option value="w">여성</option>
</select>
<br>
<textarea name="letter" rows="10" style="width: 100%;">안녕하세요~~~</textarea>
<br>
<div>
<button type="submit">타입 서브밋 버튼</button>
</div>
<br>
<button type="button" onclick="a();">타입 버튼 버튼</button>
</form>
토큰 (Token) : 1회의 세션에 사용되는 일회용 패스워드(OTP)를 생성하는 기술
일정한 시간동안 보여지고 시간이 지나면 토큰 시간이 만료되어 접속해있는 곳에서 튕겨짐
파일에 토큰이 같이 와야하고 get
방식으로 넣어줄 수 있다.
{% csrf_token %} : 보안 토큰 문구
Django에는 기본 보안 규칙이 있어서 반드시 써줘야 하는 문구다.
안쓰면 보안 에러 페이지 403
가 뜬다.
다른 곳으로 라우팅 경로를 설정해야 정상 작동한다.
{ % 언어 % } : Django Template 언어, 안에 코딩이 가능함
{ { '변수' } } : 변수를 써서 출력이 가능하게 하는 문구
Input Type에 hidden
설정을 하지 않아도 Django가 알아서 value 값에 암호화된 문자열을 만들어서 토큰을 발행시켜준다.
views.py
를 열어서 다음과 같이 입력해준다.from django.shortcuts import render
import random
def send(req):
return render(req, 'b.html')
def rec(req):
return render(req, 'd.html', {'info1':req.POST.get('name'), 'info2':req.POST.get('address')})
send
: b.html
을 인자로 받는 함수
rec
: d.html
을 인자로 받는 함수
info1
, info2
: 웹으로부터 POST
방식으로 요청받아서 넘겨줄 임의의 변수명
name
, address
: 웹으로부터 넘겨받은 값들의 Attribute
urls.py
에서 설정해준다.from django.urls import path
from . import views
urlpatterns = [
path('receive', views.rec),
path('send', views.send)
]
receive
, send
: url을 통해 접속할 경로
rec
,send
: views.py
로부터 받은 함수 이름
send
페이지를 보여줄 b.html
화면을 작성한다.<html>
<body>
<form action="http://49.50.162.71:8100/headbomb/receive" method="post">
{% csrf_token %}
<br>
이름 : <input type="text" name="name">
<br>
주소 : <input type="text" name="address">
<br>
<button>전송</button>
</form>
</body>
</html>
receive
페이지를 보여줄 d.html
화면을 작성한다.<html>
{% csrf_token %}
회원가입 성공!! 축하합니다!!
<br>
가입하신 분 성함 : {{info1}}
<br>
가입하신 분 주소 : {{info2}}
</html>
본인IP주소/프로젝트 앱폴더의 'urls.py'에서 작성했던 주소/send
로 접속전송
버튼 눌러서 다음 화면 확인※ 이해가 안된다면 앞에서 기술한 내용들을 토대로 곱씹으면서 이해해보려고 노력해보자
views.py
from django.shortcuts import render
import random
# Create your views here.
def hello(req):
a = random.choice([True, False])
return render(req, 'ab.html', {'parameter1':a, 'parameter2':'true, false중 랜덤으로 나옴'})
def send(req):
return render(req, 'b.html')
def rec(req):
return render(req, 'd.html', {'info1':req.POST.get('ID'),
'info2':req.POST.get('password'),
'info3':req.POST.get('email'),
'info4':req.POST.get('address'),
'info5':req.POST.get('Pnumber1'),
'info6':req.POST.get('Pnumber2'),
'info7':req.POST.get('Pnumber3'),
'info8':req.POST.get('gridcheck'),
}
)
b.html
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>
<title>유승완의 Django Form 태그 연습</title>
</head>
<body>
<br></br/>
<div class="col-sm-6 col-sm-offset-6">
<h2>SSAC 회원가입</h2>
<br>
<form action="http://49.50.162.71:8100/headbomb/receive" method="post">
{% csrf_token %}
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputID">아이디</label>
<input type="id" class="form-control" id="inputID" name="ID">
</div>
<div class="form-group col-md-6">
<label for="inputPassword">비밀번호</label>
<input type="password" class="form-control" id="inputPassword" name="password">
</div>
</div>
<div class="form-group">
<label for="inputEmail">E-mail</label>
<input type="text" class="form-control" id="inputEmail" name="email">
</div>
<div class="form-group">
<label for="inputAddress">주소</label>
<input type="text" class="form-control" id="inputAddress" name="address" placeholder="서울특별시 중구 세종대로 40">
</div>
<div class="form-row">
<div class="form-group col-md-3">
<label for="inputPNum">휴대폰 번호</label>
<select id="inputPNum" class="form-control" name="Pnumber1">
<option selected>번호 선택</option>
<option>010</option>
<option>011</option>
<option>012</option>
<option>017</option>
<option>018</option>
</select>
</div>
<div class="form-group col-md-3">
<label for="inputPNum01">'</label>
<input type="text" class="form-control" id="inputPNum01" name="Pnumber2">
</div>
<div class="form-group col-md-3">
<label for="inputPNum02">'</label>
<input type="text" class="form-control" id="inputPNum01" name="Pnumber3">
</div>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="gridCheck" name="gridcheck">
<label class="form-check-label" for="gridCheck">
위와 같은 사실을 확인했습니다.
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">회원가입</button>
</form>
</div>
</body>
</html>
d.html
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>
<title>화면 출력 결과</title>
</head>
<body>
<br></br/>
<div class="col-sm-6 col-sm-offset-6">
<h2>SSAC 회원가입이 완료되었습니다!</h2>
<br>
<form action="http://49.50.162.71:8100/headbomb/receive" method="post">
{% csrf_token %}
<div class="form-row">
<div class="form-group col-md-6">
<label for="inputID">아이디 : </label>
{{info1}}
</div>
<div class="form-group col-md-6" style="display: none;">
<label for="inputPassword">비밀번호</label>
{{info2}}
</div>
</div>
<div class="form-group">
<label for="inputEmail">E-mail : </label>
{{info3}}
</div>
<div class="form-group">
<label for="inputAddress">주소 : </label>
{{info4}}
</div>
<div class="form-row">
<div class="form-group col-md-3">
<label for="inputPNum">휴대폰 번호 : </label>
{{info5}} - {{info6}} - {{info7}}
<div class="form-group" style="display: none;">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="gridCheck" name="gridcheck">
<label class="form-check-label" for="gridCheck">
위와 같은 사실을 확인했습니다.
</label>
{{info8}}
</div>
</div>
</form>
</div>
</body>
</html>
1. 회원가입 입력 페이지 화면 :
2. 회원가입 결과 페이지 화면 :
Models라는 파일에 앱이 모여서 프로젝트가 되듯이 테이블을 하나씩 모여서 하나의 DB가 되는 거 아닌가?
Models.py에는 클래스를 만든다. 테이블을 만든게 아니다. 테이블의 형태로 갖게될지 안갖게 될지는 모른다. 우리가 사용하는 DB는 뭔지 모르니까.
클래스를 하나만 쓸 수 있는 게 아니라 여러 개 쓸 수 있다. 이에 필요한 DB는 하나만 필요한 것이 아닐 수도 있다.
Django는 여기서 만든 앱을 다른 프로젝트에서 쓸 수 있다.
👉 오늘 수업 간략 후기 : 점심에 먹은 제육 김해 사는 그분이 떠오르면 안되요 을 잘못 먹었는 지 수업에 집중이 잘 안되었다. 다음부터는 먹는 것도 생각해서 컨디션 조절을 하자.