ddit/Python

Python 웹 프레임워크 Django

ssong2ku 2022. 9. 5. 20:22
728x90

Django

특징

  • 오픈소스, flask보다 사용자가 더 많아서 자료 찾기가 편리함
  • flask보다 약 10배 많은 코드 라인으로 개발해서 더 무거움(full stack web framework)
  • 프레임워크가 복잡하지만 틀에 맞추면 쉽게 큰 프로젝트도 가능(자유도가 적음)
  • 속도가 더 빠름(근데 상관없다고함)
  • RDBMS와의 상호 작용을 완전히 지원하는 기본 내장 ORM과 함께 제공.이 ORM은 마이그레이션 생성 및 관리도 지원. 내장 된 유효성 검사를 사용하여 데이터베이스 모델을 만드는 것이 상대적으로 더 편안함.
    -유지 보수하기편함
  • django는 자동으로 관리자 화면을 구성(admin 페이지를 말하는거 같다)Instagram, Spotify, YouTube, Dropbox, Bitbucket, Eventbrite...
  • Django를 사용하는 사이트

Flask

  • 오픈소스, Django보단 상대적으로 사용자가 적음.
  • Django의 1/10수준으로 가벼움
  • 매우 가볍고 심플한 Framework를 지향하는 점이 특징(Micro framework)
  • Flask는 기본 기능 제공에 다양한 확장 모듈을 이용할 수 있는 구조여서 자유도가 높음
  • Flask에는 DB ORM 구조가 따로 존재 하지 않음. 개발자가 원한다면 ORM 지원 패키지를 선택해서 사용하면 된다. (보통 SQLAlchemy 를 사용한다)
  • REST API 서버처럼 요청과 응답이 매우 확정적인 경우에는 가볍고 군더더기 없는 Flask 개발이 더 효율적

Flask를 사용하는 사이트

Flask를 사용하는 회사 중 일부는 Reddit, Mailgun, Netflix, Airbnb 등입니다.

 

https://velog.io/@gigymi2005/Django-%EC%99%80-Flask-%EB%B9%84%EA%B5%90

 

Django 와 Flask 비교

파이썬 프레임워크끼리의 비교!

velog.io

 

-Django 설치

cmd나 anaconda prompt 관리자 권한으로 실행(아나콘다를 권장)

pip install django(==4.0.3)

 

이클립스에서 설치되었는지 확인

-Window =>Proferences

 

프로젝트 생성>Run As>1 PyDev: Django

>이클립스에 뜨는 주소 복사 후 웹에 붙여넣기

 

*urls에 urlpatterns 추가하기

"""HELLODJANGO URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
import HELLODJANGO.views

urlpatterns = [
    path('admin/', admin.site.urls),
    #'경로(url)',폴더이름.모듈이름.함수이름
    path('hello', HELLODJANGO.views.hello),
    path('myparam', HELLODJANGO.views.myparam),
    path('param', HELLODJANGO.views.param),
    path('db', HELLODJANGO.views.db),
    path('db2', HELLODJANGO.views.db2),
    path('forward', HELLODJANGO.views.forward),
    path('emp', HELLODJANGO.views.emp),
]

-hello.py

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello Django.")

-daoemp.py

import pymysql

class DaoEmp:
    def __init__(self):
        self.con = pymysql.connect(host='127.0.0.1', user='root', password='python',
                       db='python', charset='utf8', port=3305) # 한글처리 (charset = 'utf8')
 
        #DictCursor은  json이랑 비슷한 형식
        self.cur = self.con.cursor(pymysql.cursors.DictCursor)
        
    def mylist(self):
        sql = "SELECT * FROM EMP"
        self.cur.execute(sql)
        mylist = self.cur.fetchall()
        
        return mylist
    
    def myone(self,e_id):
        sql = f"""SELECT E_ID,E_NAME,SEX,ADDR FROM EMP where e_id='{e_id}'"""
        self.cur.execute(sql)
        myone = self.cur.fetchall()
        
        return myone[0]
        
        
    #소멸자 GC없어서 메모리를 소멸시켜줘야함    
    def __del__(self):
        self.cur.close()
        self.con.close()  
    
    def myinsert(self,e_id,e_name,sex,addr):
       
        sql=f"""insert into emp(e_id, e_name, sex, addr) 
               values('{e_id}','{e_name}','{sex}','{addr}')"""
        cnt = self.cur.execute(sql)
        self.con.commit()
        
        return cnt
    
    def myupdate(self,e_id,e_name,sex,addr,e_id2):
        sql = f"""update emp 
        set e_id='{e_id}',e_name='{e_name}',sex='{sex}',addr='{addr}' 
        where e_id='{e_id2}'"""

        emp=self.cur.execute(sql)

        self.con.commit()
        
        return emp
    def mydelete(self,e_id):
        sql = f"""delete from emp where e_id='{e_id}'"""
        emp = self.cur.execute(sql)
        self.con.commit()     
        
        return emp
        
if __name__ == '__main__':
    de = DaoEmp()
    list = de.mylist()
    #print("list",list[3]["addr"])
    # emp=de.myone('3')
    # print("emp",emp)
    
    cnt=de.myinsert('5','5','5','5')
    print("cnt",cnt)
    
    # emp=de.myupdate('7', '7', '7', '7', '5')
    # print("emp",emp)
    
    # emp = de.mydelete('2')
    # print("emp : ",emp)

-views.py

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import pymysql
from HELLODJANGO.daoemp import DaoEmp
from aiohttp.client import request
from django.shortcuts import render


def hello(request):
    return HttpResponse("Hello World.")

def myparam(request):
    a=request.get.get("a","000")
    return HttpResponse("myparam :"+a)
#템플릿을 사용하지 않는 상황에서 csrf 공격에 대해서 방어하기 위해 csrf 를 비활성화
@csrf_exempt
def param(request):
    a=request.POST.get("a","000")
    return HttpResponse("param"+a)
def db(request):
    # STEP 1 
    
    # STEP 2: MySQL Connection 연결
    con = pymysql.connect(host='127.0.0.1', user='root', password='python', db='python', charset='utf8', port=3305) # 한글처리 (charset = 'utf8')
     
    # STEP 3: Connection 으로부터 Cursor 생성
    cur = con.cursor()
     
    # STEP 4: SQL문 실행 및 Fetch
    sql = "SELECT * FROM EMP"
    cur.execute(sql)
    db=cur.fetchall()
    # 데이타 Fetch 요거
    # res="<table border='1' width ='500' height='300' align = 'center'><th>e_id</th><th>e_name</th><th>sex</th><th>addr</th>"
    # for idx in db: 
    #     e_id = idx [0]
    #     e_name = idx [1]
    #     sex = idx [2]
    #     addr = idx [3]
    #     res += "<tr><td>" + e_id + "</td><td>"+ e_name +"</td><td>"+  sex +" </td><td>"+ addr +" </td></tr>"
    # res+="</table>"
    # return HttpResponse("db"+res)
    # STEP 5: DB 연결 종료
    cur.close()
    con.close()
    
def db2(request):
    de =DaoEmp()
    list = de.mylist()
    txt = ""
    for e in list:
        txt +="{},{},{},{}<br/>".format(e['e_id'],e['e_name'],e['sex'],e['addr'])
       
    return HttpResponse(txt)    

def forward(request):
    
    mylist =[
        {'e_id':'1','e_name':'1','sex':'1','addr':'1'},
        {'e_id':'2','e_name':'2','sex':'2','addr':'2'},
        {'e_id':'3','e_name':'3','sex':'3','addr':'3'}
    ]
    
    a="홍길동"
    b={"전우치","신사임당","허균"}
    data={
        'a':a,
        'b':b,
        'mylist':mylist
    }
    return render(request,"forward.html",data)


def emp(request):
    de= DaoEmp()
    mylist=de.mylist()
    
    data={
        'mylist':mylist
    }
    
    return render(request,"emp.html",data)

 

-templates>emp.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
FORWARD2<br/>

<table border='1'>
<th>e_id</th><th>e_name</th><th>sex</th><th>addr</th>
{%for e in mylist%}
	<tr>
	<td>{{e.e_id}}</td>
	<td>{{e.e_name}}</td>
	<td>{{e.sex}}</td>
	<td>{{e.addr}}</td>
	</tr>
{%endfor%}
</table>
</body>
</html>

 

-templates>forward.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
FORWARD<br/>
a : {{a}}<br/>
b : 
{%for i in b%}
	{{i}}<br/>
{%endfor%}

<table border='1'>
<th>e_id</th><th>e_name</th><th>sex</th><th>addr</th>
{%for e in mylist%}
	<tr>
	<td>{{e.e_id}}</td>
	<td>{{e.e_name}}</td>
	<td>{{e.sex}}</td>
	<td>{{e.addr}}</td>
	</tr>
{%endfor%}
</table>
</body>
</html>
728x90