'Django'에 해당되는 글 2건

  1. 2020.03.18 JSON Response in Django Templates
  2. 2020.02.22 Django Setup
Django/JSON Response2020. 3. 18. 22:06

VaRest 플러그인을 언리얼 엔진에 설치하고 웹서버(Django)에 로그인하는 예

서버측에서 Template을 이용하지 않고 JSON 포맷으로 응답

 

users 앱 생성

python manage.py startapp users

위의 명령으로 App을 생성한 후에 생성되는 urls.py, views.py를 아래처럼 작성한다

 

users 앱 등록

프로젝트 settings.py 에 위에서 생성한 users 앱을 등록한다

INSTALLED_APPS = [
    'users',    # 새로 추가한 앱
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

users/urls.py

from django.urls import path 
from . import views

app_name = 'users'
urlpatterns = [
    path('', include('django.contrib.auth.urls')),
    path('register', views.register, name='register'),
    path('login_custom', views.login_custom, name='login_custom'),
]

 

users/views.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.http import JsonResponse


def register(request):
    if request.method != 'POST':
        form = UserCreationForm()
    else:
        form = UserCreationForm(data=request.POST)
        if form.is_valid():
            new_user = form.save()
            login(request, new_user)
            return redirect('learning_logs:index')

    context = {'form': form}
    return render(request, 'registration/register.html', context)


def login_custom(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user:
            if user.is_active:
                login(request, user)
                print('request.user=', request.user)
            #return render(request, "users/login_result.html")
            return JsonResponse({'result': true })
        else:
            #return render(request, "users/login_result.html")
            return JsonResponse({'result': false })

 

위의 서버에 UE4 VaRest 플러그인을 사용한 로그인 ( 그림을 클릭하면 그림 전체를 볼 수 있어요~)

 

jQuery를 사용한 로그인 예

Django 서버측에서 users 앱을 생성하고 users/ajax_login 으로 요청하는 경우

 

users/urls.py

from django.urls import path, include
from . import views

app_name = 'users'
urlpatterns = [
    path('', include('django.contrib.auth.urls')),
    path('register', views.register, name='register'),
    path('login_custom', views.login_custom, name='login_custom'),
    path('login_result', views.login_result, name='login_result'),
    path('ajax_login', views.ajax_login, name='ajax_login'),
]

 

users/views.py

def ajax_login(request):
    if request.method != 'POST':
        return render(request, 'users/ajax_login.html')
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user:
            if user.is_active:
                login(request, user)
                print('request.user=', request.user)
            return JsonResponse({"result": True})
        else:
            return JsonResponse({"result": False})

 

urls/templates/users/ajax_login.html

 

<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script>
   $(document).ready(function(){

      console.log('jQuery Ready');
      $.ajax({
            url:'/users/ajax_login',
            data:{'username':'tj', 'password':'tj'},
            dataType:'json',
            method:'post',
            success:function(res) {
                  if(res.result){ alert('로그인 성공'); }
                  else alert('로그인 실패');
            },
            error : function(request, status, error){
                  console.log(error);
            }
      });
});
</script>

Posted by cwisky
Django/Setup2020. 2. 22. 19:57

Python 설치 / PATH 환경변수 설정

 

가상환경(Vertual Environment)

한개의 가상환경은 다른 가상환경과 서로 디렉토리가 다르며 파이썬과 그 라이브러리의 버전을 달리 설치할 수 있다

 

1. 가상환경을 설치할 디렉토리 생성

django_web 등의 임의의 이름을 가진 디렉토리를 생성한다

아래의 모든 명령은 언급이 없으면 위에서 생성한 디렉토리 안에서 실행한다

 

CMD를 이용하여 특정 디렉토리로 이동하여 그 곳에 가상환경을 생성하는 명령은 다음과 같다.

python -m venv venv01    /* venv01 은 가상환경의 이름이며 해당 디렉토리가 생성된다 */

 

 

2. 가상환경의 활성화

source venv01/bin/activate

가상환경이 활성화된 후에라야 해당 가상환경에 패키지를 설치할 수 있고 가상환경에 이미 설치된 파이썬 패키지를 사용할 수가 있다

윈도우 환경에서는 'source' 를 빼고 그냥 'venv01\Scripts\activate' 명령을 사용하고,

Power Shell 을 사용한다면 Activate 첫자는 대문자('A')를 사용해야 한다

가상환경이 활성화되면 아래처럼 괄호 안에 가상환경의 이름이 표시된다

(venv01) c:\Python_Projects>  

가상환경이 활성화된 경우에만 Django 를 사용할 수 있다

 

 

필요시 가상환경의 비활성화 명령

deactivate

커맨드창을 닫으면 가상환경도 비활성화된다

 

 

3. Django 설치

가상환경이 생성되고 활성화된 디렉토리 안에서 다음과 같은 명령으로 해당 가상환경에 Django를 설치할 수 있다.

장고 2.2 버전에 맞는 mysqlclient 가 아직 없기 때문에 장고 2.1버전을 설치한다(2020.03.02현재 장고 2.2 와 mysqlclient를 연결하는 과정에서 아래와 같은 오류가 발생함)

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

pip install django <- django 최신버전이 설치되어 mysqlclient 현재버전과 연결할 때 오류발생

 

MySQL 8 버전과 호환되는 Django 2.1을 설치할 때는 아래처럼 버전을 지정할 수 있다

pip install django==2.1

 

 

4. Django 프로젝트 생성

django-admin startproject myproj .

마지막에 있는 점(.)을 빠뜨리지 않도록 한다. 만약 빠뜨린 경우에는 가상한경 디렉토리만 남기도 모두 삭제한 후에 다시 명령을 실행한다

 

 

MySQL 설정

디폴트로 제공되는 SQLite3 데이터베이스를 사용하지 않고 MySQL 을 사용하려는 경우에는 아래처럼 변경한다

윈도우용 MySQL Client 설치(사용하는 Python 버전에 따라 적당한 설치파일 선택)

MySQL 8, Python 3.8, Django 2.1 환경일 때 아래의 방법으로 문제 없이 성공함

 

윈도우용 mysqlclient 다운로드(cp38: 파이썬 3.8의미, 설치된 Python이 32비트인지 64비트인지 확인하여 해당파일 사용). mysqlclient 설치에 실패하면 64비트 버전과 32비트 버전을 변경하여 설치하면 성공하는 경우도 있다고 함

 

 

4. 설치된 Python의 몇 비트인지 확인하는 Python명령

>>> import platform 
>>> print(platform.architecture())

 

 

5. 미리 컴파일된 mysqlclient 다운로드

https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python

 

 

6. MySQL Client 설치

Downloads 폴더에 다운로드했다면, 해당 폴더로 이동하여

pip install mysqlclient-1.4.6-cp38-cp38-win32.whl

 

 

7. pymysql 모듈 설치

pymysql 모듈을 사용하는 경우

pip install pymysql

프로젝트 폴더 안의 settings.py를 열고 ...

 

 

8. settings.py 파일 내용의 맨 위에 다음과 같이 추가한다

import pymysql 
pymysql.install_as_MySQLdb()

 

 

9. settings.py 중간 약간 아랫쪽에서 다음과 같은 내용을 찾아서 아래처럼 변경한다

# Database 
https://docs.djangoproject.com/en/3.0/ref/settings/#databases 
# 디폴트 상태는 아래와 같다
DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
}

 

# MySQL을 사용하려면 위의 내용을 아래처럼 해당 데이터베이스 연결정보로 변경한다

DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'testdb', 
        'USER': 'root', 
        'PASSWORD': 'a1234', 
        'HOST': 'localhost', 
        'PORT': '3306',
    } 
}

 

 

10. cryptography 설치

pip install cryptography

 

 

11. 프로젝트를 관리할 데이터베이스 생성

python manage.py migrate

settings.py 에 설정된 데이터베이스가 생성된다

위의 과정 중에 아래처럼 오류가 발생할 수 있다

RuntimeError: cryptography is required for sha256_password or caching_sha2_password

위의 오류는 cryptography 모듈이 설치되지 않았기 때문에 발생하므로 아래처럼 설치한 다음, 위의 명령을 다시 실행한다

 

 

 

데이터베이스 생성에 성공하면 MySQL 의 지정된 DB(여기서는 testdb) 안에 10개 정도의 테이블이 생성된 것을 확인할 수 있다(MySQL Workbench 등에서 쉽게 확인)

 

 

12. 내장된 웹서버를 실행하여 프로젝트 작동상태를 웹브라우저로 확인

python manage.py runserver

(venv01) c:\Python_Projects>python manage.py runserver 
Watching for file changes with StatReloader 
Performing system checks... 

System check identified no issues (0 silenced). 
February 22, 2020 - 19:39:13 
Django version 3.0.3, using settings 'myproj.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CTRL-BREAK.

CTRL-C 를 사용해도 웹서버를 중지할 수 있다

 

 

13. 웹브라우저로 접속

http://localhost:8000

웹브라우저에 위의 URL에 접속해보면 로켓트와 아래의 문장이 보이면 성공한 것이다

The install worked successfully! Congratulations!

 

포트번호 변경

에러나 접속이 되지 않는 경우에는 8000 번 포트번호를 이미 다른 프로그램에서 사용 중일 경우가 많다. 다음과 같은 명령을 사용하여 포트번호를 변경할 수 있다

python manage.py runserver 8001

 

 

Posted by cwisky