λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
βœ’οΈ Python Programming/Frameworks

< django - 8 >

by A Lim Han 2022. 8. 1.

8. 데이터 μ €μž₯ + 닡변등둝 폼 + URL 맀핑 + λ·° ν•¨μˆ˜ + λ‹΅λ³€ μ €μž₯ + λ‹΅λ³€ 쑰회

 

 

 

# 닡변등둝 폼

- 질문 상세 νƒ¬ν”Œλ¦Ώμ— μ•„λž˜μ™€ 같이 λ‹΅λ³€ μ €μž₯이 κ°€λŠ₯ν•œ 폼(form) μΆ”κ°€

파일λͺ… :&nbsp;projects\mysite\templates\pybo\question_detail.html

+ λ‹΅λ³€ λ‚΄μš© μž…λ ₯ν•˜λŠ” 곡간인 ν…μŠ€νŠΈμ°½(textarea), λ‹΅λ³€ μ €μž₯이 κ°€λŠ₯ν•œ "닡변등둝" λ²„νŠΌμ΄ 좔가됨

 

+ line 6의 {% url 'pybo:answer_create' question.id %}   -->  form νƒœκ·Έμ˜ action 속성에 μžˆλŠ” λ‹΅λ³€ μ €μž₯을 μœ„ν•œ URL

 

+ line 7의  {% csrf_token %}   -->  formμ—μ„œ μž‘μ„±ν•œ 데이터가 μ‹€μ œλ‘œ μ›ΉνŽ˜μ΄μ§€μ—μ„œ μž‘μ„±ν•œ 데이터인지λ₯Ό νŒλ‹¨ν•˜λŠ” 역할을 함. λ§Œμ•½ μ›ΉνŽ˜μ΄μ§€μ—μ„œ μž‘μ„±ν•œ 데이터가 아닐 경우 μ„œλ²„μ—μ„œ λ°œν–‰ν•œ csrf_token κ°’κ³Ό λ‹€λ₯Έ κ³³μ—μ„œ μž‘μ„±λœ csrf_token 값이 달라 λΈ”λ‘ν‚Ήλœλ‹€. λ³΄μ•ˆ κ΄€λ ¨ κΈ°λŠ₯이기에 form νƒœκ·Έ 밑에 κΌ­  {% csrf_token %}  νƒœκ·Έλ₯Ό λ„£μ–΄μ•Ό 였λ₯˜κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€.

 

+ CSRF(cross site request forgery) : μ›Ή μ‚¬μ΄νŠΈ 취약점 곡격 방지λ₯Ό μœ„ν•œ 기술둜, μž₯κ³ κ°€ μ„Έμ…˜μ„ 톡해 λ°œν–‰ν•œ CSRF 토큰값과 μ›ΉνŽ˜μ΄μ§€κ°€ 폼 전솑 μ‹œμ— ν•¨κ»˜ μ „μ†‘ν•œ 토큰을 λΉ„κ΅ν•˜μ—¬ μ‹€μ œ μ›Ή νŽ˜μ΄μ§€μ—μ„œ μž‘μ„±λœ 데이터가 μ „λ‹¬λ˜λŠ”μ§€λ₯Ό κ²€μ‚¬ν•˜λŠ” κΈ°μˆ μ΄λ‹€.

-->  csrf_token을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ²˜λŸΌ CsrfViewMiddleware 미듀웨어가 μžˆμ–΄μ•Ό 함.

projects\mysite\config\settings.py 파일의 MIDDLEWARE ν•­λͺ©

 

 

 

 

# URL 맀핑

1. http://localhost:8000/pybo/2/ 질문 상세 νŽ˜μ΄μ§€ μš”μ²­  -->  answer_create λ³„칭을 찾을 수 μ—†λ‹€λŠ” 였λ₯˜ λ°œμƒ

+ 질문 상세 ν…œν”Œλ¦Ώμ— {% url 'pybo:answer_create' question.id %} 같이 pybo:answer_create λ³„칭을 μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— 였λ₯˜ λ°œμƒ

 

 

 

2. 였λ₯˜ 해결을 μœ„ν•΄ pybo/urls.py 에 path('answer/create/<int:question_id>/', views.answer_create, name='answer_create') URL 맀핑을 등둝 

파일λͺ… :&nbsp;projects\mysite\pybo\urls.py

+ answer_create 별칭에 ν•΄λ‹Ήν•˜λŠ” URL 맀핑 κ·œμΉ™μ„ 등둝함

 

+ 이후 http://locahost:8000/pybo/answer/create/2/  λ“±μ˜ νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λ©΄ μœ„μ— μΆ”κ°€ν–ˆλ˜ URL 맀핑 κ·œμΉ™μ— μ˜ν•΄ views.answer_create ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.

 

 

 

# λ·° ν•¨μˆ˜

: URL 맀핑 κ·œμΉ™μ— μ •μ˜λœ views.answer_create ν•¨μˆ˜λ₯Ό pybo/views.py νŒŒμΌμ— μ•„λž˜μ™€ 같이 μΆ”κ°€

파일λͺ…은&nbsp;projects\mysite\pybo\views.py

+ request.POST.get('content')  -->  ν…μŠ€νŠΈμ°½μ— μž…λ ₯ν•œ λ‚΄μš©μ„ 읽을 수 있게 함

+ request.POST.get('content')  -->  POST둜 μ „μ†‘λœ 폼(form) 데이터 ν•­λͺ© 쀑 content 값을 의미

+ λ‹΅λ³€ 등둝 μ‹œ ν…μŠ€νŠΈ 창에 μž…λ ₯ν•œ λ‚΄μš©μ€ answer_create ν•¨μˆ˜μ˜ 첫번째 λ§€κ°œλ³€μˆ˜ request 객체λ₯Ό 톡해 읽을 수 있음

 

+ answer_create ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ question_idλŠ” URL 맀핑에 μ˜ν•΄ κ°’ 전달

ex. http://locahost:8000/pybo/answer/create/2/ λΌλŠ” νŽ˜μ΄μ§€λ₯Ό μš”μ²­ -> λ§€κ°œλ³€μˆ˜ question_idμ—λŠ” κ°’ 2κ°€ 전달

 

+ question.asnswer_set.create  -->  λ‹΅λ³€ 생성 μœ„ν•΄ μ‚¬μš©

+ question.answer_set  -->  질문의 λ‹΅λ³€ 의미

+ Question λͺ¨λΈκ³Ό  Answer λͺ¨λΈμ€ μ„œλ‘œ ForignKey 둜 μ—°κ²°λ˜μ–΄ 있음

 

+ redirect ν•¨μˆ˜ : λ‹΅λ³€ 생성 ν›„ 질문 상세 화면을 λ‹€μ‹œ 보여주기 μœ„ν•΄( pybo:detail λ³„칭에 ν•΄λ‹Ήν•˜λŠ” νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜κΈ° μœ„ν•΄ ) μ‚¬μš©ν•œ νŽ˜μ΄μ§€ 이동을 μœ„ν•œ ν•¨μˆ˜

 

+ pybo:detail 별칭에 ν•΄λ‹Ήν•˜λŠ” URL은 question_idκ°€ ν•„μš”  -->  question.idλ₯Ό 인수둜 전달

 

 

 

 

# λ‹΅λ³€ μ €μž₯ 및 상세 ν™”λ©΄ 호좜 + λ‹΅λ³€ 쑰회

1. http://localhost:8000/pybo/2/ νŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•œλ‹€.

+ λ“±λ‘ν•œ 닡변을 ν‘œμ‹œν•˜λŠ” κΈ°λŠ₯은 아직 ν…œν”Œλ¦Ώμ— μΆ”κ°€ν•˜μ§€ μ•Šμ•˜κΈ°μ— 닡변을 λ“±λ‘ν•˜λ”λΌκ³  화면에 λ³€ν™” X

 

 

 

2. λ“±λ‘ν•œ 닡변을 질문 상세 화면에 ν‘œμ‹œν•˜κΈ° μœ„ν•΄ 질문 상세 ν…œν”Œλ¦Ώμ„ μ•„λž˜μ²˜λŸΌ μˆ˜μ •

파일λͺ…은&nbsp;projects\mysite\templates\pybo\question_detail.html

+ question.answer_set.count  -->  λ‹΅λ³€μ˜ 총 개수 의미

+ question.answer_set  -->  질문과 μ—°κ²°λœ λ‹΅λ³€λ“€

 

 

 

3. μ €μž₯ -> λ‹€μ‹œ http://localhost:8000/pybo/2/ νŽ˜μ΄μ§€λ₯Ό μš”μ²­

닡변을 μΆ”κ°€ν•  수 있고, μΆ”κ°€λœ 닡변이 μ •μƒμ μœΌλ‘œ λ‚˜νƒ€λ‚¨

 

'βœ’οΈ Python Programming > Frameworks' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

< django - 10 >  (0) 2022.08.04
< django - 9 >  (0) 2022.08.03
< django - 7 >  (0) 2022.08.01
< django - 6 >  (0) 2022.07.30
< django - 5 >  (0) 2022.07.30