728x90

 

✏️함수 ()의 유무차이

 

파이썬은 1급 객체 언어입니다.

def func(): return 1

일때,

 

func() 은 함수 호출이지만 func 는 함수의 포인터이다. (함수의 주소)

def process(f):
	return f()
    
def func(): return 1

print(process(func))

>>>1

 

func 를 process 함수로 대입해서 실행한다.

 

 

 

 

**model.py에서 field변경 시엔 migration해줘야 하지만 메소드 추가는 migration안해줘도 됨.

 


 

-- MariaDB와 Django 연동

 

** Maria DB – Spring Boot 데이터

  1. 사용자 계정 생성과 Database 생성

  • Root 권한으로 사용자 계정 생성하기

mysql -u root –p

show databases;

use mysql;

create user python@localhost identified by ‘python';

grant all on *.* to python@localhost;

flush privileges;

exit;

  • 사용자 계정으로 database 생성하기

mysql -u python -p

create database django_db;

show databases;

use django_db;

 

 

** Pymysql과 Mysqlclient 설치

1) Django와 Mysql(MariaDB)을 연동하기 위해서는 pymysql과 mysqlclient 라는 패키지가 둘 다 필요합니다.

2) Mysqlclient (https://pypi.org/project/mysqlclient/, https://github.com/PyMySQL/mysqlclient-python )

3) Pymysql (https://pypi.org/project/PyMySQL/ https://github.com/PyMySQL/PyMySQL )

4) 설치

pip install mysqlclient

pip install pymysql

 

 

** Django 프로젝트 설정 (settings.py) 수정하기

mydjango/settings.py  파일에서 DATABASES 부분을 찾아서 아래와 같이 수정

 

#mysite/settings.py

import pymysql
pymysql.version_info = (2, 0, 2, "final", 0)
pymysql.install_as_MySQLdb()

 

 

DATABASES = {

    # 'default': {

    #  'ENGINE': 'django.db.backends.sqlite3',

    #  'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

    #}

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'django_db', # DB명

        'USER': 'python', # 데이터베이스 계정

        'PASSWORD':'python', # 계정 비밀번호

        'HOST':'localhost', # 데이테베이스 IP

        'PORT':'3306', # 데이터베이스 port

    }

}

 

** Django 프로젝트 설정 (settings.py) 수정하기

MariaDB에 마이그레이션 하고, 새로운 User를 생성한다.

  • python manage.py migrate

  • python manage.py makemigrations blog

  • python manage.py migrate blog

  • python manage.py createsuperuser

 

 


 

************************

Servlet /JSP + JDBC

 

Spring Framework + MyBatis + JSP

: 공공 프로젝트 전자정부프레임워크

 

Spring Boot + JPA + Thymeleaf

: Server Side Rendering(배민이 사용하는 방식)

 

Spring Boot + JPA :  REST Service

: Client Side Rendering(JS역할이 커짐),

JS-

: jQuery

: ReactJS(facebook, ES6 Script) ,create-react-app

: Angular(google, typescript) , Angular-CLI

: VueJS(Evan You,  ES6 Script), vue-cli

 

*************************

 

Server-Side Rendering

: JSP, Thymeleaf, PHP, Django

: server에서 html 작성해서 클라이언트로 내려주는 방식

: Synchronous (동기)방식으로 통신

-> request(요청)을 보내고 응답(response)이 올때까지 클라이언트는 waiting하는 방식

 

Client-Side Rendering

: server에서는 data(xml, json, csv)를 내려주면, 클라이언트에서 html을 동적으로 작성하는 방식

: REST(REpresentional State Transfer)

-Http URI(Resource) + HTTP Method (GET, POST, PUT, DELETE)

 

Postman - Chrome API

: REST Client

 

Ajax(Asynchronous Javascript and XML)

: Asynchronous(비동기) 방식으로 통신

-> request(요청)을 보내고 response(응답)을 waiting하지 않고, 다른 일을 하는 방식

-> javascript의 XmlHttpRequest(XHR)가 비동기 방식으로 통신을 해주는 역할을 담당한다.

 

 


--목록 - 페이징 처리

https://docs.djangoproject.com/en/3.1/topics/pagination/

 

Pagination | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

https://getbootstrap.com/docs/4.0/components/pagination/

 

Pagination

Documentation and examples for showing pagination to indicate a series of related content exists across multiple pages.

getbootstrap.com

 

-> shell

 

In [1]: from django.core.paginator import Paginator

 

In [2]: objects = ['java', 'boo', 'jpa', 'python', 'django']

 

In [3]: objects

Out[3]: ['java', 'boo', 'jpa', 'python', 'django']

 

In [4]: p = Paginator(objects,2)

 

In [5]: p.count

Out[5]: 5

 

In [6]: p.num_pages

Out[6]: 3

 

In [7]: p.page_range

Out[7]: range(1, 4)

 

In [8]: for val in p.page_range:

   ...:     print(val)

   ...:

1

2

3

 

In [9]: page1 = p.page(1)

 

In [10]: type(page1)

Out[10]: django.core.paginator.Page

 

In [11]: page1.object_list

Out[11]: ['java', 'boo']

 

In [12]: page1.has_previous()

Out[12]: False

 

In [13]: page1.has_next()

Out[13]: True

 

In [14]: page2 = p.page(2)

 

In [15]: page2.object_list

Out[15]: ['jpa', 'python']

 

In [16]: page2.has_previous()

Out[16]: True

 

In [17]: page2.has_next()

Out[17]: True

 

In [18]: page3 = p.page(3)

 

In [19]: page3.has_previous()

Out[19]: True

 

In [20]: page3.has_next()

Out[20]: False

 

In [22]: page1.next_page_number()

Out[22]: 2

 

In [23]: page2.previous_page_number()

Out[23]: 1

 

In [24]: page2.next_page_number()

Out[24]: 3

 

In [27]: page1.start_index()

Out[27]: 1

 

In [28]: page2.end_index()

Out[28]: 4

 

In [29]: page1.end_index()

Out[29]: 2

 

In [30]: page2.start_index()

Out[30]: 3

 

In [31]: page3.start_index()

Out[31]: 5

 

In [32]: page3.end_index()

Out[32]: 5

 

 

#views.py

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# Post 목록
def post_list(request):
    # posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    post_list = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    paginator = Paginator(post_list, 2)
    page_no = request.GET.get('page')
    
    try:
        posts = paginator.page(page_no)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
        
    return render(request, 'blog/post_list.html', {'posts':posts})

 

 

#templates/blog/post_list.html

{% include 'blog/post_pagination.html' with page=posts %}

 

#templates/blog/post_pagination.html

<nav>
    <ul class="pagination">
        <li class="page-item">
            {% if page.has_previous %}
                <a class="page-link" href="?page={{page.previous_page_number}}">Previous</a>
            {% endif %}
        </li>
        <li class="page-item">
            <a class="page-link">Page {{page.number}} of {{page.paginator.num_pages}}</a>
        </li>
        <li class="page-item">
            {% if page.has_next %}
                <a class="page-link" href="?page={{page.next_page_number}}">Next</a>
            {% endif %}
        </li>
    </ul>
</nav>

 


-- Django REST Framework

 

Client-Side Rendering

: server에서는 data(xml, json, csv)를 내려주면, 클라이언트에서 html을 동적으로 작성하는 방식

: REST(REpresentional State Transfer)

-Http URI(Resource) + HTTP Method (GET, POST, PUT, DELETE)

 

Postman - Chrome API

: REST Client

 

구글 웹 스토어 -> Postman 다운

https://www.django-rest-framework.org

 

Home - Django REST framework

 

www.django-rest-framework.org

https://www.django-rest-framework.org/tutorial/quickstart/

 

Quickstart - Django REST framework

We're going to create a simple API to allow admin users to view and edit the users and groups in the system. Create a new Django project named tutorial, then start a new app called quickstart. # Create the project directory mkdir tutorial cd tutorial # Cre

www.django-rest-framework.org

 

pip install djangorestframework

 

django-admin startproject mydjango_rest .

python manage.py startapp person

 

#setting.py

INSTALLED_APPS = [
    ...
    'rest_framework',
    'person',
]

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

 

python manage.py migrate

python manage.py runserver 8080

 

python manage.py createsuperuser

id : rest

password : rest

 

#models.py

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    age = models.IntegerField()

python manage.py makemigrations person

python manage.py migrate person

 

#admin.py

from django.contrib import admin
from .models import Person

# Register your models here.
admin.site.register(Person)

 

#person/serializers.py

from .models import Person
from rest_framework import serializers

class PersonSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Person
        fields = ('id', 'first_name', 'last_name', 'age')

 

# views.py

from django.shortcuts import render
from rest_framework import viewsets
from .models import Person
from .serializers import PersonSerializer

class PersonViewSet(viewsets.ModelViewSet):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

 

#person/urls.py

from django.urls import include, path
from rest_framework import routers
from person import views

router = routers.DefaultRouter()
router.register(r'people', views.PersonViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

 

#mydjango_rest/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('person.urls'))
]

 

 

 

->Postman

  1. post(글 입력)

    2. get(조회)

 

 

    3. PUT(수정)

http://localhost:8080/people/4/

입력과 동일

 

    4. DELETE(삭제)

전체삭제 -> http://localhost:8080/people/

1건삭제 -> http://localhost:8080/people/4

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts