✏️함수 ()의 유무차이
파이썬은 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 데이터
-
사용자 계정 생성과 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
-
post(글 입력)
2. get(조회)
3. PUT(수정)
http://localhost:8080/people/4/
입력과 동일
4. DELETE(삭제)
전체삭제 -> http://localhost:8080/people/
1건삭제 -> http://localhost:8080/people/4
'CLOUD > Django' 카테고리의 다른 글
1/21 Django - 복습 2차시(with VS Code) (0) | 2021.01.21 |
---|---|
1/20 - Django 복습(with VS Code) (0) | 2021.01.20 |
1/14 Django 3차시 - blog app만들기(CRUD + 로그인/로그아웃 + reply) (0) | 2021.01.14 |
1/13 Django 2차시 - blog app만들기(list, detail), css, bootstrap (0) | 2021.01.13 |
1/12 Django 1차시 - blog만들기 (0) | 2021.01.12 |