settings - 장고 프로젝트 전체의 환경설정
urls - 장고 프로젝트 전체의 api를 담당(url주소 생성 및 관리)
- WinError 10013시 해결방법
[WinError 10013](https://velog.io/@hyeon5819/23.4.3-TIL)
- views.py에서 보여지는 것들 작업진행
- templates 에 생성한 html을 보여주기 위해서 views.py에 from django.shortcuts import render 를 import한 후 html파일을 render해주는 함수를 생성한다
- urls.py에서 html이 띄워지는 url을 생성한다.
- ex) path('first/',views.first_view,name='first_view'),
url 파일명.함수이름
- 터미널에 'django-admin startapp 폴더명' 입력시 폴더 생성(app생성)
- 생성한 app을 프로젝트가 읽어올 수 있도록 settings.py에 추가
- settings.py의 INSTALLED_APPS에 폴더명 추가
- 기존 있던건 장고의 기본 기능들
오른쪽 데이터베이스에서 + 클릭 > 경로 데이터소스 > 같은경로에 있는 db.sqlite3 선택 >
> SQLite 드라이버 선택 > 드라이버가 없는 경우 아래 알림표시에 있는 다운로드 > 연결 Test
> 적용 후 확인
ORM(Object Relational Mapping)은 데이터베이스를 하나의 '객체(Object)'덩어리로 보고, 데이터베이스를 SQL언어가 아닌 클래스로 쉽게 표현 및 사용 할 수 있게 해준다.
- 기본적으로 user모델로 사용자의 관리와 로그인/로그아웃, 회원가입 장고에 다 구현이 돼있다.
- user model에 필요한 것 (이름, 비밀번호, 상태메세지, 생성일, 수정일 등)
- user app > models.py에 생성
- 클래스 생성 ex) class UserModel(models.Model)
#user/models.py
from django.db import models
# Create your models here.
class UserModel(models.Model):
class Meta: ------> #데이터베이스에 정보를 넣어주는 역할
db_table = "my_user" db_table에 이름을 지정
username = models.CharField(max_length=20, null=False) #이름
password = models.CharField(max_length=256, null=False) #비밀번호
bio = models.CharField(max_length=256, default='') #상태메세지
created_at = models.DateTimeField(auto_now_add=True) #생성일
updated_at = models.DateTimeField(auto_now=True) #수정일
#models.뒤에 있는 것들은 데이터베이스에 어떤 형태로 들어가게 되는지 설정해준다.
-문자열 : CharField, TextField
-날짜/시간: DateTimeField, DateField, TimeField
-숫자 : IntegerField, FloatField
-다른 테이블과 연관을 지어 줄 때 : ForeignKey
- 모델을 만들고난 후 데이터베이스에 알려줘야함
- 데이터베이스 변경을 알려준다
--"데이터베이스 만들었어~, 데이터베이스에 넣을 클래스 하나 만들었어~, 이런 모델을 만들었어~"
데이터베이스 변경을 알려주는 명령어 python manage.py makemigrations
- 변경된 데이터베이스를 반영해준다
--"그 알려준 내용들을 데이터베이스에 적용시켜줘~"
변경된 데이터베이스를 반영 해 주는 명령어 python manage.py migrate
- my_user가 데이터베이스에 생성됨
관리자 페이지를 직접 만들어주는 기능
연결되어 있는 데이터베이스의 데이터 수정, 추가, 삭제 가능
http://127.0.0.1:8080/admin
admin페이지에 접근할 수 있는 superuser생성
super user를 생성하는 명령어 python manage.py createsuperuser
입력한 Username, password입력 로그인
- user app > admin.py
from django.contrib import admin
from .models import UserModel -그 중 UserModel을 불러오겠다.
└현재 경로와 같은 위치의 models.py를 불러오겠다. // '.' = '현재경로와 같은 위치의'
# Register your models here.
admin.site.register(UserModel) # 이 코드가 나의 UserModel을 Admin에 추가 해 줍니다
tweet app > models.py
# tweet/models.py
from django.db import models
from user.models import UserModel
# Create your models here.
class TweetModel(models.Model):
class Meta:
db_table = "tweet"
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
content = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
- makemigrations, migrate 입력해주기
- tweet가 데이터베이스에 생성됨
- tweet > admin.py
from django.contrib import admin
from .models import TweetModel
# Register your models here.
admin.site.register(TweetModel)
회원가입, 로그인 화면 띄우기
기본 베이스 html과 user관련 기능인 로그인/회원가입 html(user폴더로 묶어줄 예정)을 templates폴더 안에 만들어준다.
html에서 {% %}을 사용
ex) {% extends 'base.html' %} -> base.html파일에 이어서 작성한다
공식문서
- 중복해서 html을 계속 작성하지 않아도 되도록 html파일을 이어서 작성할 수 있도록 도와준다.
- html에 파이썬의 기능들을 추가해줄 수 있도록 도와준다.
그림으로 이해하기 1. 사용자가 url요청 -> 브라우저에서 url입력 2. mySpartaSns에 요청 접수 -> settings.py가 있는 가장 처음 작성한 앱의 urls.py(이하 1url) 3. 등록된 url찾기 -> urls.py(1url)에 연결 된 앱에 생성 한 urls.py(이하 2url) 4. 해당 url(2url에 해당되는)에 등록 된 view 찾기
- mySpartaSns > urls.py(1url)
- from django.urls import path에 ', include' 추가
- urlpatterns에 include를 사용하여 user.urls추가
--path('',include('app.urls')) -> app의 urls.py를 포함시킨다.
┕공백
(user app views.py 예시)
from django.shortcuts import render
# Create your views here.
def sign_up_view(request):
return render(request, 'user/signup.html')
def sign_in_view(request):
return render(request, 'user/signin.html')
┕보여준다 ┕user의 signin.html을
(user app urls.py 예시)
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
┕url ┕views.py의 sign_in_view 실행
]
동일한 url에서 여러 동작들이 실행되기 때문에 'GET'과 'POST'에 따라 기능들을 나눠줘야함
ex) 회원가입 페이지 띄워주기 -> GET방식
가입정보 입력/전송 -> POST방식
- sing_up_view와 연결된 templates > singup.html에서 들어오는 방식에 따라 구분
from django.shortcuts import render, redirect -> 마지막 회원가입 완료시 로그인화면을 띄워주기 위해 ', redirect'을 추가한다.
from .models import UserModel -> POST방식으로 들어온 데이터를 저장해줘야하기때문에 import해준다.
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST': ┌**signup.html의 input의 name과 맞춰줘야함
username = request.POST.get('username',None) #POST방식으로 들어온 데이터중에서
password = request.POST.get('password', None) username, password, password2, bio
password2 = request.POST.get('password2', None) 를 받을거다. 만약 없다면 None으로 설정해준다.
bio = request.POST.get('bio', None)
if password != password2: #만약 password, password2가 같지 않다면
return render(request, 'user/signup.html') signup페이지를 다시 띄워준다.
else: #그게 아니면(=password, password2가 같다면)
new_user = UserModel() new_user라는 UserModel을 만들어준다.
new_user.username = username 해당하는 데이터들을 가진
new_user.password = password
new_user.bio = bio
new_user.save() ***데이터베이스에 저장
return redirect('/sign-in') #회원가입이 완료된 후 로그인 페이지 띄워주기
- POST요청으로 회원가입 정보를 보낼 form박스를 수정해준다.
- input의 name값이 post로 보내질 내용들이다.
{% csrf_token %}
장고에서 데이터를 post방식으로 보낼 때 보안을 지켜주기 위해서 적어주는 기능
from 아래에 보안토큰 코드를 넣어준다.
<form class="form-area" method="post" action="/sign-up/">
{% csrf_token %}
화면에 있는 데이터를 서버로 전송할때 많이 사용되는 태그
<form class="form-area" method="post" action="/sign-up/">
┕통신방법 지정 ┕url 지정(**뒤에 /가 없으면 오류남**)
- 서버와 클라이언트 사이에서 '요청'과 '응답'을 한다. 그 때 같은 사람이 요청을 하는지 확인할 수 있도록 도와주는 역할.
-- '세션'은 '사용자의 정보'를 저장 할 수 있다.
from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse -> 로그인이 성공한다면 로그인 성공이라는 메세지 출력을 위해 추가한다.
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username',None)
password = request.POST.get('password',None)
┌UserModel.objects = 이미 데이터베이스에 연결돼있는 객체
me = UserModel.objects.get(username=username)
.get = 중에서 가져온다┘ └앞의 username은 UserModel의 데이터에 있는 username / 뒤의 username은 POST로 받아 온 데이터
└>> # UserModel에 있는 username들 중에서 POST로 받아온 username과 같은 user를 me로 가져오겠다.
if me.password == password: #불러온 me의 password값이랑 입력된 password값이랑 같다면
request.session['user'] = me.username #session(사용자 정보를 저장할 수 있는 공간)에 user(me.username)를 넣는다.
return HttpResponse('로그인 성공!')
else:
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
- POST요청으로 로그인 정보를 보낼 form박스를 수정해준다.
- input의 name값이 post로 보내질 내용들이다.
{% csrf_token %}
장고에서 데이터를 post방식으로 보낼 때 보안을 지켜주기 위해서 적어주는 기능
from 아래에 보안토큰 코드를 넣어준다.
<form class="form-area" action="/sign-in/" method="post">
{% csrf_token %}
화면에 있는 데이터를 서버로 전송할때 많이 사용되는 태그
┌통신방법 지정
<form class="form-area" action="/sign-in/" method="post"> -> <>내부의 action, method 순서는 상관없음
┕url 지정(**뒤에 /가 없으면 오류남**)