반응형

아...힘든 하루네요.

회사에서 쓰는게 oracle 11g 2Release 32bit라서 이걸 모델로 집에서 django랑 연동 테스트 해보려고 삽질을 시작했는데... 오전 9:30분에 시작해서 지금, 오후 10:00에서야 드디어 완성했습니다. 그것도 완전한 완성이라고 볼 순 없고 부분적으로 모자란 부분이 있습니다.

 

오늘 최종적으로 성공한 각 프로그램/모듈의 버전은 아래와 같습니다.

  oracle 11g 2Release 64bit

  Python 3.6.1 64bit

  Django 1.11.22

  cx_Oracle 6.3

 

32비트고 뭐고 왔다갔다 하느라 정신없어서..64비트로 우선 통일!

안되는 영어로 계속 뒤져보니까 요즘나오는 Django 3.0이나 2.X대 버전은 oracle 11g를 지원을 안한다고 합니다. 가능한 버전이 Django 1.11.XX대 버전이라고 합니다. 문제는 얘도 Python 버전을 가리는데..최신 3.8은 안되고 2.7 ~ 3.6 까지만 된다네요.... 버전맞추기 참 힘듭니다. cx_Oracle은 나중에 알아보니 그냥 최신 깔아도 될 것 같습니다. 여기까진 그냥 고생한 내용이고..

현재는 버전에 크게 상관없이 잘 구동이 됩니다.

 

Django와 Oracle 연동하는 방법을 알아보겠습니다. 피곤해서 캡쳐는 생략하겠습니다. (나중에 시간나면 업뎃하는걸로..)

 

1. 버전 확인. 오라클과 연동할 때 같은 32bit 또는 64bit인지 꼭 확인합니다.

=> 64bit를 기본으로 깔면 32bit와 연동할 때에도 큰 문제없이 가능합니다.

 

2. oracle 11g와 연동할 django 1.11.22버전 설치합니다.

  - pip install django~=1.11.22

(특정 버전을 골라 설치하려면 이렇게 해도 되지만, Django 3.0부터는 ASGI를 지원하므로, 굳이 구버전을 설치할 필요는 없습니다.)

 

3. DB연동을 위한 cx_Oracle을 설치합니다.

  - pip install cx_Oracle

 

4. 프로젝트 생성

  - django-admin startproject mysite (새로 생성되는 mysite폴더에 manage.py가 생성됩니다. 귀찮아짐..)

  - django-admin startproject mysite . (마지막에 . 을 찍어주면 현재 폴더에 manage.py가 생성됩니다.)

 

5. 앱 생성

  - python manage.py startapp polls

 

6. Database 접속정보 수정

 

 

 

7. inspectdb를 이용하여 models.py생성

  - python manage.py inspectdb test>polls/models.py

  - error발생 가능: TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

  - Django 버전을 꼭 확인하시기 바랍니다. Django 2.0이상 버전은 oracle11g와 안맞는다네요...가끔 했다는 분들도 계신데, 그냥 고수이신걸로...ㅠㅜ

 

8. python manage.py migrate --fake-initial (기존 Oracle 데이터가 있을 경우 불요)

  - error발생 가능: django.db.utils.DatabaseError: ORA-00955: name is already used by an existing object

  - 최초 migration한 파일이 남아있을 수 있으니 지우고 다시

    python manage.py makemigrations 와

    python manage.py migrate --fake-initial 수행하고 진행하시기 바랍니다.

  - Database 테이블이 초기화 상태이어야 합니다. 데이터가 있으면 이 에러메시지가 발생합니다. 좀 이상한데,, 데이터가 존재하는 경우 연동을 어떻게 시키는지 아시는 분께서 답글좀 달아주시면 정말 감사하겠습니다.

 

오전 9시30분부터 시작해서 저녁 10:00 완료하기까지 알아낸 것 치고는 별거 없네요...

Python, Django, Oracle 버전 맞춘다고 지웠다 깔았다 계속하고, 특히 오라클 지우고 3번 다시 까느라 시간 다 보내고,

Django가 쉽다는데.....너무 어렵게 시작하는 것 같은...

 

 

 

그럼 이만~

 

(ps) 2020.06.03: 기존 오라클의 데이터가 있을 경우 makemigrations와 migrate는 없어야합니다. DB정보만 잘 입력해주면, 그리고 inspectdb만 잘 끌어오면 기존 데이터는 접근 가능합니다.

 

(ps) 2021.11.19: 특정 테이블만 가져오기

# python manage.py inspectdb --database=디비명 테이블명1 테이블명2 > 폴더이름/models.py 

python manage.py inspectdb --database=default TEMP TEMP2 > ./models/models.py

 

반응형
반응형

회사에서 쓰는 windows server2012에서 장고를 실행하려고 알아본 내용을 남깁니다.

 

1. Static 파일을 위한 '가상 디렉터리 추가'

(Django_ex)장고 사이트를 우클릭한 뒤 가상 디렉터리 추가를 클릭해줍니다.

 

2. 별칭과 실제 경로를 적어줍니다.

3. 핸들러 위치 조정: Django_ex(장고 사이트) -> 처리기 매핑 ->정렬된 목록보기

StaticFile을 가장 위로 옮겨줍니다. 아래쪽에 있는 핸들러는 위쪽 핸들러로부터 상속을 받기 때문에, 아래쪽에 있으면 제대로 작동이 안됩니다.

왼쪽에서 사이트 클릭 후 가운데 화면에서 '처리기 매핑' 선택 클릭
화면 기본 설정은 이름 알파벳 순으로 되어있음. 오른쪽에서 '정렬된 목록보기' 클릭

 

실행 우선순위로 정렬된 모습. StaticFile을 최상위로 올려준다.(우측 위/아래 이동버튼 이용)

(ps) 외부 포트연결이 설정이 안되어있을 경우 여전히 사이트가 접속 안될 수 있습니다. 포트가 제대로 개방되어있는지 확인하시기 바랍니다. (이전 포스트 참조^^)

 

(끝)

 

반응형
반응형

Django에 CSS를 적용하는 방법은 어렵지 않은데... 적용하려면 저같은 초보한테는 쉽지않네요. 

우선 기록으로 남겨놓습니다.

 

1. mysite/setting.py의 STATIC정보를 수정/확인합니다.

STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join('static'), )

2. CSS파일 생성(style.css)하여 아래 경로에 위치시킵니다.

mysite/static/css/style.css

li a {

    color: green;

}

3. HTML에 static file 로딩부분을 추가해줍니다.

{% load static %}   # 버전에 따라 staticfiles
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="{% static 'css/style.css' %}" />
    <title>Title</title>
</head>

 

~~끝~~

 

(ps)

각 앱별로 static파일을 정의해놓았을 경우, STATICFILES_DIR 대신

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

를 설정하고,

python manage.py collectstatic 명령어를 주어 /static/폴더내로 복사해주면 적용됨.

 
 
반응형
반응형

 

Windows server 2012 IIS환경에서 Django를 연동하는게 쉽지가 않아서 한번 정리해 놓습니다. Django로 직접 서버를 돌릴 수도 있으나, 보안 및 성능상의 문제로 인해 권하지 않는 방법이라고 합니다. 그래서 apache나 nginx등 웹서버와 연동해서 많이 사용하는데요... 저희 회사 환경이 Windows 서버라 IIS 와의 연동이 필요한 상황입니다.

 

1. pip install wfastcgi

Django와 연동을 위해 wfastcgi를 설치합니다.

 

2. IIS FastCGI 설정

IIS에서 Django에 CGI요청을 전달하기 위해 설정을 해야합니다

 

1) FastCGI 설정

 서버 관리자를 실행시키고, 왼쪽 탐색창에서 서버가 선택된 상태로 FastCGI설정을 클릭합니다.

 

2) 응용프로그램 추가

 우측 작업에서 응용프로그램 추가를 클릭합니다. 이는 FastCGI 응용프로그램을 추가합니다. IIS - FastCGI - Django 가 연결될 수 있게 중간다리 역할을 하는 프로그램 설정이라고 생각하면 됩니다.

 

환경 변수에 3가지 값을 입력한다.

1. Name: DJANGO_SETTINGS_MODULE, Value: ex1.settings (앱 이름.settings)

2. Name: PYTHONPATH,                     Value: D:\django_ex\ex1 (앱 까지의 경로)

3. Name: WSGI_HANDLER,                  Valeu: django.core.wsgi.get_wsgi_application() (고정 값)

 

 

설정 추가된 모습

 

3. 웹페이지 생성

 왼쪽 탐색창의 저장소가 선택되 상태에서 우측 작업 아래에 웹페이지 생성을 클릭합니다. 사이트 이름을 입력하고, 실제 경로로 장고 앱의 위치를 입력합니다. 포트는 장고 기본 설정인 8000으로 했습니다.

 

4. IIS 핸들러 설정 (처리기 매핑)

IIS가 FastCGI를 찾아갈 수 있도록 처리기 매핑을 해야합니다.

 

1) 처리기 매핑 선택

 

2) 화면 우측 작업의 ㅎ위메뉴 모듈 매핑 추가 클릭

 

 

요청경로: *

모듈: FastCgiModule

실행파일(옵션): D:\99_wij_test\django_ex\venv\Scripts\python.exe|D:\99_wij_test\django_ex\venv\Lib\site-packages\wfastcgi.py

이름: Django_Handler

 

요청제한: 매핑 - "요청이 다음에 매핑되는 경우에만 처리기 호출" 을 언체크 합니다.

 

 

응용프로그램 만드는 것은 "아니오" 선택.

 

5. 포트 오픈

이렇게까지 했으면 8000번 포트에서 서비스를 하게 됩니다. localhost:8000 입력시 django 시작 화면이 보일 것입니다. 그러나 외부로 해당 포트를 open하지 않았으면 외부에서 접근이 불가능합니다. 특정 포트 오픈하는 방법에 대해서는 이전 포스트를 참고하시기 바랍니다.

 

포트까지 오픈이 되었다면, 외부에서도 접근이 가능해집니다.

끝~

반응형
반응형

Django 설치를 위해서는 whl 파일을 내려받아서 설치해야 하는데, https://pypi.org/사이트에서 파일들을 내려받아 설치할 수 있습니다.

 

우선 현재 시점으로 www.Django-3.0.6-py3-none-any.whl 버전을 설치하려고 하는데 아래와 같이 관련 패키지들을 추가 설치했습니다.

1. www.pytz-2020.1-py2.py3-none-any.whl

2. www.sqlparse-0.3.1-py2.py3-none-any.whl

3. www.asgiref-3.2.7-py2.py3-none-any.whl

 

한 폴더에 whl 파일들을 넣고 

pip install xxx.whl

을 실행해주면 관련 패키지들이 설치됩니다. 그리고 최종적으로 Django 패키지를 설치하면 됩니다.

 

반응형
반응형

아직 웹앱 / 웹서버 / API 이런 개념이 없긴 하지만, 회사의 웹 환경은 뭔가 기초가 되는 웹서버가 있고 앱들이 그 위에서 돌아가고 있기 때문에, 오늘은 go 웹앱과 nginx를 연동하는 방법에 대해 알아볼까 합니다.

 

1. go 앱 작성

아래와 같이 간단한 코드를 작성하고 빌드해서 exe파일을 만들어 줍니다.

// main.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello World")
	})

	http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
		name := r.URL.Path[len("/greet/"):]
		fmt.Fprintf(w, "Hello %s\n", name)
	})

	http.ListenAndServe(":9990", nil)

}

그리고 exe파일을 실행해줍니다. 브라우저로 포트 9990에 접속하면 아래와 같이 나옵니다.

간단하게 웹앱이 만들어졌습니다.

 

2. NginX 설치

저는 NginX 사이트를 들어갔었는데, 다운받는 경로를 찾기가 힘들더군요. 다운로드로 검색해서 들어갔습니다. 참고로 이곳 링크를 따라가시면 됩니다. 압축 파일이 다운받아지는데, 설치하는 프로그램이 아니고 곧바로 실행가능한 파일입니다. 따라서 "C:\" 나 "C:\Program Files\" 등 적당한 곳에 옮겨줍니다.

 

 

3. NginX 실행

저는 C:\ 바로 밑에 설치했는데요, 해당 폴더의 nginx.exe 파일을 실행하시면 nginx 서버가 실행됩니다.

그리고 브라우저를 통해서 localhost에 접속하면

nginx에 온걸 환영한다고...이렇게 나옵니다.

 

4. nginx.conf 파일 수정 및 재실행

nginx 설치 폴더의 conf폴더 내 nginx.conf 파일을 수정하여 server 부분에 아래의 코드만 남기고 제거합니다. 이렇게 해서 localhost:80으로 접근하면 자동으로 localhost:9990으로 연결되도록 합니다.

 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://127.0.0.1:9990;  # 변경된 부분
            #root   html;
            #index  index.html index.htm;
        }

        #error_page  404              /404.html;

그리고 커맨드창에서(path 추가 안했다면, 설치폴더 경로로 이동) nginx -s reload 명령으로 재시작합니다.

 

5. localhost 확인

이번엔 localhost:80으로 다시 접속합니다. 그러면 go로 만든 앱의 결과물이 나타나는 것을 확인할 수 있습니다.

6. 기타

아래 ubuntu환경에서 go 웹앱을 nginx와 연동하는 방법에 대한 포스팅을 참조했습니다만, 그 중 systemd unit file 작성하는 부분을 누락했습니다. 왜하는지도 모르겠고, 어떻게 하는지도 모르겠네요. 아시는 분께서는 댓글 부탁드려요. 사실 이것 뿐만 아니라, 애초에 그냥 go 웹앱만 여러개 만들어서 돌리면 되는것 아닌가요? 굳이 apache나 nginx같은 웹서버랑 연동을 해야하는 걸까요? 취미로 혼자 공부하다보니 힘드네요. 누가 좀 알려주세요~~^^;;;;;

 

참고사이트

https://www.digitalocean.com/community/tutorials/how-to-deploy-a-go-web-application-using-nginx-on-ubuntu-18-04

반응형
반응형

오늘은 gin framework으로 만든 앱을 heroku에 배포하기까지 실행해보겠습니다. python 앱의 경우 pythonanywhere라는 무료 가능한 사이트가 있어서 좋았는데, 비슷한 걸 찾다보니 heroku에서 무료 배포가 가능했습니다. Heroku는 git과 연동되어 운용되니 Git도 설치가 필요합니다.

 

사전 준비

1. Git 설치

2. Heroku 설치

3. Gin 설치

 

방법

1. Git Repository 생성

Github에 가입하였다면, Repository 관리 페이지로 가서 새로운 Repository를 생성해줍니다. 별다른 설정사항 손댈 필요 없이 적당한 이름을 부여하고, Public으로 생성합니다.

 

 

2. 생성한 repository 로컬 pc에 다운로드

pc에 생성하고 github으로 올리는 방법도 있겠지만, 아직 git/github에 익숙하지 않은 필자는 github에 생성 후 다운받아서 작업합니다.

go get -u github.com/seaofcalm/gin-test

%GOPATH%\src\github.com\ 경로 아래에 본인의 github 아이디와 생성한 repository 이름의 조합으로 repository가 다운받아지게 됩니다.

 

3. 다운받은 경로에 Gin 앱 구성

해당 경로로 이동하여 예제 파일을 생성합니다.

 

 

<예제 소스>

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

첫 페이지에서 결과를 확인할 수 있도록 gin 웹사이트에서 제공하는 예제 소스를 약간...정말 약간 수정하였습니다.("/pong" -> "/"으로 수정)

 

4. 디펜던시 파일 생성

디펜던시 파일을 생성해 주어야 Heroku에서 앱으로 인식을 합니다. govendor나 godep 등 여러 프로그램들이 있지만, 기본 설치되어있는 go module 프로그램으로 충분합니다. (사실 위 두 프로그램으로 시도해 보다가 실패함..)

<1> go mod init        //go.mod파일 생성

<2> go build

<3> go mod vendor   //vendor폴더에 디펜던시 파일 다운받음

 

 

 

5. Git에 추가

<1> git init                             // Git 시작

<2> git add .                          // 새 파일들을 넣거나 변경 파일들을 git에 인식시킴

<3> git commit -m "아무말이나" // git 커밋

<4> git push origin master        // git 푸쉬. 실질적인 파일 복사. heroku에만 올리려면 굳이 수행하지 않아도 됨.

 

6. Heroku에 추가

<1> heroku login                      //헤로쿠 로그인

<2> heroku create gin-retest       // "gin-retest" heroku git 생성 (앱 이름 중복으로 다른 이름 부여함)

<3> heroku git:remote -a gin-retest // 원격모드 연결

<4> git push heroku master        //heroku로 배포

 

7. 결과 확인

그럼 지금까지 수행한 결과를 확인해 보겠습니다.

우선 Heroku 사이트 로그인 후 우측 상단의 Dashboard 화면으로 이동해보면, 방금 만든 App(gin-retest)이 보입니다.

 

 

해당 앱을 클릭해서 들어간 화면에서 우측 상단의 Open app을 클릭해줍니다.

 

 

아래와 같이 코드로 작성한 앱이 잘 실행되는지 확인합니다.

 

 

이상 golang gin 웹프레임워크 앱을 heroku에 배포하는 방법에 대해 알아보았습니다.

그럼 이만~~

 

(ps) git/heroku/gin 등의 활용과 관련하여 정확히 모르는 상태로 앱을 작성하다보니 오류가 있을 수 있습니다. 오류 알려주세요. 정정 요청 댓글 환영합니다.

반응형
반응형
package main

import (
	"fmt"
	"image/color"
	_ "unicode/utf8"

	"fyne.io/fyne"
	"fyne.io/fyne/app"
	"fyne.io/fyne/canvas"
	"fyne.io/fyne/layout"
	"fyne.io/fyne/theme"
	"fyne.io/fyne/widget"
)

func main() {
	f := app.New()
	//f.Settings().SetTheme(theme.LightTheme())
	f.Settings().SetTheme(theme.DarkTheme())
	w := f.NewWindow("")

	//상단에 넣을 위젯 및 레이아웃 - NewFormLayout
	qry := widget.NewEntry()
	btn_go := widget.NewButton("New Memo", New_btn)

	text := canvas.NewText("Text Object", color.White)
	text.Alignment = fyne.TextAlignTrailing
	text.TextStyle = fyne.TextStyle{Italic: true}

	ret := fyne.NewContainerWithLayout(layout.NewFormLayout())
	ret.AddObject(btn_go)
	ret.AddObject(qry)

	//하단에 넣을 위젯 및 전체 레이아웃 구성 - NewBorderLayout
	label2 := widget.NewLabel("Simple Memo")
	labox2 := fyne.NewContainerWithLayout(layout.NewCenterLayout(), label2)

	b1 := widget.NewButton("Go1", func() { fmt.Println("Go1 Button") })
	b1.ExtendBaseWidget(b1)

	b2 := widget.NewButton("Go2", func() { fmt.Println("Go2 Button") })
	b2.ExtendBaseWidget(b2)

	out_entry := widget.NewMultiLineEntry()
	out_entry.SetPlaceHolder("결과...")
	out_entry.ExtendBaseWidget(out_entry)

	frm := fyne.NewContainerWithLayout(layout.NewBorderLayout(ret, labox2, nil, nil)) //상, 하, 좌(없음), 우(없음)
	frm.AddObject(ret)                                                                //상단
	frm.AddObject(labox2)                                                             //하단
	frm.AddObject(out_entry)                                                          //좌-우가 없으므로 5번째에(center) 추가됨

	w.SetContent(frm)
	w.Resize(fyne.Size{Height: 640, Width: 480})
	w.ShowAndRun()

}

 

반응형

+ Recent posts