22.09.02. HELLODJANGO

2022. 9. 2. 13:48카테고리 없음

Java의 MVC패턴과 Servlet을 사용하듯 python에서도 그 기능을 사용할 수 있는데, 일단 그 전에 flask와 django 방식 중 django 방식으로 진행하기 위해 설치를 진행했다. 그냥 cmd에서 하기 보다는 anaconda prompt를 관리자 권한으로 실행하여 진행할 것. 노란색이나 빨간색 글씨가 없다면 성공적으로 설치된 것이라고 한다. 경고 문구가 떴다면 이클립스에서 설치가 되어있는지 확인해보고 설치가 되지 않았다면 uninstall한 뒤 다시 해보기.

 

프로젝트를 생성하고 (다른 프로젝트 뜨는 것은 그냥 체크하지 않고 넘어갔음) 해당 프로젝트 오른쪽 마우스>Run As>1 PyDev: Django를 누른다.

그럼 이클립스의 콘솔에 문구가 뜨는데 그 중 url 주소처럼 보이는 주소를 복붙해서 브라우저에 입력한다.

해당 주소를 입력했을 때 위와 같은 화면이 보여야 정상적으로 설치된 것인 듯.

 

프로젝트명을 바꾸면 자바처럼 프로젝트명을 쓰는 코드들이 바뀌지 않아서 실행이 잘 안 됐다. (HELLPDJANGO라고 잘못 써서 HELLODJANGO로 이름을 바꿔주었더니 코드를 잘 작성해도 계속 에러가 나서 봤더니 HELLPDJANGO가 자꾸 에러에 등장해서 아 뭐임.. 왜 자꾸 뜨냐... 했는데 3군데 쯤에서 프로젝트 이름을 가져다 쓰는데 선생님께서 찾기 힘들다고 새로 만드는 게 더 빠르겠다고 하셨다. 따흐흑...

 

왼쪽 코드를 작성하고 오른쪽 코드들을 urls.py에 추가했다.

결과물.

 

 

python의 경우 request.GET.get('a','000')라고 코드를 작성하면 'a'라는 이름의 파라미터를 기본값이 '000'으로 보내겠다고 설정할 수 있다. Java의 경우에는 기본값 지정이 없기 때문에 파라미터로 받아오는 코드는 있으나 보내진 파라미터가 없다면 

 

뭐..하라고 하셨는데... 못 들었다...

cmd로 서버 실행시키기.

프로젝트의 경로에서 cmd를 실행시킨 후 python manade.py runserver를 치면 서버가 실행되고 웹 파일을 실행시킬 수 있게 된다. 

위에 했던 GET방식으로 파라미터 값을 받는 것 말고 POST 방식으로도 받아봤는데 기왕 하는 김에 method에 따라 알아서  get이면 get으로, post면 post로 나뉘어 실행되도록 짜봤다.

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def myparam(request):
    if request.method == 'GET':
        a = request.GET.get('a', '000')
        return HttpResponse("param: "+a)
    elif request.method == 'POST':
        a=request.POST.get('a','000')
        return HttpResponse("param"+a)

CSRF란 사이트 간 요청 위조로 말 그대로 사용자의 요청을 위조하여 사용자의 의지와는 상관없이 공격자가 원하는 행위를 하게 만드는 공격이다. 특정 사용자가 대상이 아니고 불특정 다수를 대상으로 로그인 된 사용자를 대상으로 이루어지는 공격이다. 이런 공격을 막기 위해 Django에서는 1.2버전부터 CSRF의 공격을 막기위한 기능이 기본적으로 설정되어있다. 따라서 이를 수동으로 해제해주거나  @csrf_exempt 장식자를 사용하여 해당 뷰에 대해서는 CSRF를 막는 기능이 작동되는 것을 해제할 수 있다.

만약 프로젝트의 모든 페이지에 대해 csrf 차단이 활성화되는 것을 막을 수 있다. 

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import pymysql

def db(request):
    conn = pymysql.connect(host='127.0.0.1', user='root', password='python', db='python', charset='utf8',port=3305)

    cur = conn.cursor()
    sql = "select * from emp"
    cur.execute(sql)
    rows=cur.fetchall()
    result="<!DOCTYPE html><html><head><meta charset='UTF-8'><title>DB</title><style>table{border-collapse: collapse;}td, th{text-align:center; padding: 5px;}</style></head><body>"
    
    result+="<table border='1'><tr><th>e_id</th><th>e_name</th><th>sex</th><th>addr</th></tr>"
    for record in rows:
        e_id = record[0]
        e_name = record[1]
        sex = record[2]
        addr = record[3]
        
        result+=f"<tr><td>{e_id}</td><td>{e_name}</td><td>{sex}</td><td>{addr}</td></tr>"
    
    result+="</table></body></html>"
    cur.close()
    conn.close()
    return HttpResponse("result"+result)

Django를 이용하여 DB에 접근, select한 데이터를 table로 출력하는 코드.

java의 jdbc와 python의 Django 비교하자면

statement = cursor

resultset = cursor.fetchall()

인 듯.

이전 시간에 했던 DB 활용은 Eclipse Console에서 했던 거라 print가 알아서 출력해줬지만 html로 내보내는 것이라 그런지 바로 출력이 안됐다. (머쓱,,,) 그래서 향상된 for문을 사용하여  해당 행의 인덱스별로 변수에 담아 해당 행을 만드는 작업을 돌렸다. 두 줄씩 나오는 테두리가 보기 싫어 스타일을 적용하다보니 인라인 스타일 적용이 되지 않아 html코드를 다 넣어버렸다. 왜 안되는 거지... 아마두 html 태그 없이 해서 앗 모야 하는 걸까 싶기도...

 

암튼 숙제까지 끗~~~!~!