1) 플라스크 api 서버 pythonanywhere에 배포

Computer 관심/Flask|2021. 9. 20. 22:05
반응형

그냥 과정을 나열하면 복잡하다고 느낄 수 있기 때문에

4개의 섹션으로 나누었다. 

1. 파일준비

2. 파이썬애니웨어에 파일설치

3. 파이썬애니웨어에 앱생성

4. 세팅(앱과 파일연결)

 

자신의 컴퓨터에서 해야할 부분

1. 파일준비

1) requirements.txt생성

2) 커밋한뒤 깃허브에 푸쉬하기

 

섹션 1 파일준비 끝

 

파이썬애니웨어에서 해야할 부분

2. 파일설치

1) 콘솔에 들어가 가상환경설치 (가상환경의 이름을 myvenv로 만듬)

mkvirtualenv myvenv --python=/usr/bin/python3.8

 

2) 깃에서 클론하기 

git clone https://github.com/깃이름/프로젝트이름.git

깃허브의 아이디와 비밀번호를 입력하라고 하는데 비밀번호 대신에 엑세스토큰을 붙여 넣는다.

 

3) 가상환경으로 들어가기

workon myvenv

 

파이썬 애니웨어 FILE 메뉴에 가보면 아래처럼 폴더와 파일들이 설치된 걸 볼 수 있다.

 .virtualenvs/

프로젝트명/

 

4) 패키지 설치하기 (프로젝트로 들어가 requirements.txt를 설치)

cd 프로젝트명

pip  install -r requirements.txt

 

섹션 2 파일 설치 끝

 

 

3. 앱 생성하기

이제 이렇게 설치한 파이썬파일과 연결할 앱을 만들어 주어야 한다.

1) 웹앱 만들기

웹앱이 없다고 하는데 하나 만들어줌

2) 프레임워크 선택

프래임워크를 고르라고 하는데 이미 플라스크와 가상환경을 만들었기 때문에 매뉴얼 컨피그레이션을 선택

 

3) 설치한 파이썬 버전을 선택

 

 

이렇게하면 웹앱이 생성완료

 

4. 세팅하기 

파이썬애니웨어에 올린 파이썬 파일과 방금 생성한 앱을 연결 시켜주는 것이다.

 

1) 소스코드를 연결시키기

프로젝트명 폴더명 적어줌

2) WSGI 컨피그레이션 수정

아래 링크를 클릭해서 헬로우월드 색션을 모두 지워줌

여기 부터 

여기까지 다 지워줌 

 

---------------------------

여기는 아래처럼 수정을 할 것이다.  (main.py에서 app을 가져옴)

참조 애플리케이션 팩토리 패턴을 사용한다면 

from 디렉토리네임 import app as application

아니면 함수로 실행하는 경우 app = create_app()

(플라스크팩토리팩턴)

 

2-02 플라스크 애플리케이션 팩토리

`[완성 소스]` : [github.com/pahkey/flaskbook/tree/2-02](https://github.com/pahkey/flaskbook/tree/2-0 ...

wikidocs.net

 

https://flask.palletsprojects.com/en/2.0.x/patterns/appfactories/

 

Application Factories — Flask Documentation (2.0.x)

Application Factories If you are already using packages and blueprints for your application (Modular Applications with Blueprints) there are a couple of really nice ways to further improve the experience. A common pattern is creating the application object

flask.palletsprojects.com

https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/

 

Introduction into Contexts — Flask-SQLAlchemy Documentation (2.x)

Introduction into Contexts If you are planning on using only one application you can largely skip this chapter. Just pass your application to the SQLAlchemy constructor and you’re usually set. However if you want to use more than one application or creat

flask-sqlalchemy.palletsprojects.com

https://www.py4u.net/discuss/201960

 

How to get Flask-SQLAlchemy to work with the Application Factory Pattern

Answer #1: At the point that code is doing db.create_all(), models haven't been imported. Importing them has the side-effect of populating some data structures that SQLAlchemy uses behind the scenes. If the db.create_all() happens before SQLAlchemy knows a

www.py4u.net

 

 

 

3) 가상환경을 연결시켜주고

 

끝 실행해봄

 

이렇게 나와서 조금 놀랐지만 / 로 향하는 리퀘스트를 만들어 놓지 않아서 그런것 이였다.

작동결과 잘됬다.

 

 

※코드를 바꿔야하는 경우.

넷틀리파이에서는 깃에 푸쉬를 하면 자동으로 바뀐 코드가 적용이 되지만 

파이썬 애니웨어는 그렇지 않다. 그래서 

 

1) 소스 수정시 깃허브에 푸쉬

2) 파이썬 애니웨어에서 git pull를 한뒤 리로드를 하면 됨.

 

 

 

디비는 그냥 sqlite3를 임시로 쓰고 있는데 파이썬애니웨어에서

따로 디비를 생성할 필요가 없었다. 그냥 파일 하나가 아래 처럼 생성이된다. (아래 보이는 inventory.db는 sqlite파일이다.)

 

SQLAlchemy가 아닌를 사용하지 않고 mysql데이터베이스를 연결 하고 싶으면 아래 블로그에 잘 나와있다. 

https://seyeon-hello.tistory.com/2

 

pythonanywhere flask 배포하기

안녕하세요. 오늘은 pythonanywhere를 이용해서 파이썬 flask 웹 프레임워크를 배포하는 과정을 설명해드리겠습니다 ~ 장고는 관련 게시물이 많은데, 플라스크는 찾기 어렵더라구요. 그래서 간단하게

seyeon-hello.tistory.com

 

 

 

다음 글은 SQLAlchemy를 사용하여 my-sql DB를 연결하는 방법에 대해 설명하려고 한다.

 

댓글()

[생각] 코딩에 대한 생각의 전환

Computer 관심/이것저것|2021. 9. 11. 12:32
반응형

프로그래머가 아닌 많은 일반인들이 프로그래밍을 배우고 있다.

심지어 5살짜리 애기도 코딩에 대해 배운다고 하는 말을 듣고 굳이 그렇게 일찍 배울 필요가 있나 싶은 생각도 들었지만 코딩이 기초학문이 되어가고 있는 것을 느낄 수 있었다. 심지어 아이들의 교육을 걱정하는 부모님까지 코딩에 대해 기본은 알고 싶다는 이야기도 들었다.

 

문득 코딩이 글쓰는 것과 비슷한 것 같다는 생각이 들었다.

글 쓰는 것은 기본적으로 모든 사람이 배우지 않는가.

그런데 코딩도 비슷한 것 같다는 것이다.

 

나는 직업이 프로그래머가 아니지만 '간단한 코드를 만든다.'

반복되는 작업을 자동으로 하는 10줄 정도의 간단한 코드이다.

다른 직원에게 설명해주고 싶지만 배우려는 의지도 없어보인다. 

그들의 생각은 '너는 프로그래머 였으니까...'

 

그런데 코딩에도 글 처럼 수준이 존재한다.

'번득이는 아이디어를 갈겨되는 한줄의 메모'

'아무렇게나 생각을 적어되는 내 블로그 수준의 글'

'전문적인 학술지의 글'

'아마추어 소설가의 글'

'작가의 글'

 

심지어 많은 사람들은 몇 년 혹은 몇 달동안 글을 적지도 않을 것이다. 

 

전문 적인 프로그래머로서의 코드는 간결하고 읽기 좋으며 구조적으로 완벽에 가까워 보일 것이지만

일반인의 코드는 그렇지 않을 수도 있으며 그럴 필요도 없다.

 

일반인이 글을 쓰며 '내 글은 완벽해야되' 라고 생각을 하면 아무 글도 쓸 수 없는 것 처럼.

일반인이 전문적인 수준의 코드를 만들어 내려고 하면 아무것도 적을 수 없다.

하지만 일반인이 쓰는 글이 가치가 없다고 여겨지지 않는 것 처럼 

일반인이 만든 코드가 가치가 없다 말 할 수도 없다. 

 

몇줄의 파이썬 코드지만 회사에서 꽤 많은 업무 시간을 줄여줄 수 있다.

돼지우리 같은 코드로 만든 회사 홈페이지가 회사에서 꽤 중요한 역할을 할 수도 있다. 

 

글을 써야 하는데 자신이 전문가가 아니라고 글을 쓰지 않겠는가.. 

 

 

코딩을 하는게 엄청나게 다른 것을 한다고 생각하는 주변사람들도 문제이다.

사무직을 다니면서 엑셀을 쓰지 않는 사람들이 얼마나 될까?

엑셀 전문가가 아니여도 엑셀을 쓴다. 

 

코드도 딱 그 정도만 되도 쓸 수 있다.

 

 

 

댓글()

파이썬으로 이미지 다운로드 하기

Computer 비관심/PyQt5|2020. 11. 10. 12:31
반응형

파이썬으로 이미지를 다운받으면 반복적인 이미지 다운로드 작업을 자동화 할 수 있다.

이 코드는 단순히 다운로드 하는 작업만 진행하지만 selenium이나 requests를 잘 섞어서 사용하면 자동으로 특정한 페이지의 이미지들을 다운 받을 수 있도록 만들 수 있다.

## 필요한 모듈을 불러온다.
import requests # to get image from the web
import shutil # to save it locally

## 다운로드할 이미지 URL
image_url = "http://~~~~.jpg"
filename = image_url.split("/")[-1]

# 스트림으로 이미지 얻어옴
r = requests.get(image_url, stream = True)

# 이미지가 잘 받아졌는지 확인
if r.status_code == 200:
    # 디코드 컨텐츠를 True로 세팅, 그렇지 않으면 파일 사이즈가 0
    r.raw.decode_content = True
    
    # 바이너리로 쓰기 권한으로 저장
    with open(filename,'wb') as f:
        shutil.copyfileobj(r.raw, f)
        
    print('Image sucessfully Downloaded: ',filename)
else:
    print('Image Couldn\'t be retreived')

댓글()

파이썬으로 Firestore 에 데이터 올리기

Computer 관심/Flask|2020. 11. 9. 22:54
반응형

플러터로 어플리케이션을 제작하였고, 어플리케이션에 필요한 데이터를 제공할 수 있는 서버가 필요했다.

파이어베이스의 파이어스토어는 쉽고 다양한 언어로 SDK를 제공한다. 그래서 플라스크를 사용하여 데이터를 올리는 간단한 서버를 만들었다. (굳이 서버로 만들지 않아도 됨....)

 

 

 

1. 웹사이트에서 서비스 어카운트 키 다운 받기

1) 파이어베이스에 들어가 새로운 프로젝트를 만든다.

2) 

 

 

3) service accounts 탭에 들어가면 아래와 같은 화면을 볼 수 있고

파이썬을 클릭한다.

4) Generate new private key 다운로드

 

5) 받은 json형식의 파일을 serviceAccountKey라고 이름을 변경한다.

 

6) 파이썬이 있는 폴더에 함께 놓는다.

 

 

2. firestore 만들기

1) 좌측 클라우드 파이어스토어를 클릭하면

서버를 선택할 수 있고 한국에서 빠른 실행을 할 수 있도록 south east2 를 선택했다.

 

2)

 

3. 파이썬 코드

firebase_admin과 Flask를 설치하고 아래와 같이 코드를 만든 뒤 실행하면

firestore에 대량으로 데이터를 업데이트 가능하다.

from flask import Flask,
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import json

#서비스어카운트키 파일에 있는 json을 불러옴
cred = credentials.Certificate("./serviceAccountKey.json")
firebase_admin.initialize_app(cred)
firebase_db = firestore.client()

app = Flask(__name__)

# localhost:8000/add 로 들어갈시 작동
@app.route("/add", methods=['GET'])
def start():
	# firestore에 올릴 json 파일 불러드림
    with open('./stock_code.json', encoding='utf-8') as f:
        datas = json.load(f)
        
    # 아래는 테스트를 해보기 위한 데이터
    # datas = [{'name': '당근','code': '012345'},{'name': '오이','code': '012341'}]
    # print(datas)

    for data in datas:
    	# document() 라고 하면 자동으로 다큐먼트의 ID가 생성됨. 
        document = firebase_db.collection('콜렉션이름적기').document()
        document.set(data)
    return 'success'
    
# 공개아이피와 포트8000번 디버그 모드로 열기
if __name__ == '__main__':
    app.run(host='0.0.0.0',  port="8000", debug=True)

 

 

 

 

댓글()

[2. 엑셀 대신 파이썬: 재고찾기 프로그램] 엑셀 대신 파이썬을 사용할때 이점

Computer 관심/Pandas|2020. 7. 18. 18:22
반응형

첫글을 쓰고 나서 필요한 코드들을 찾데 2-3시간 걸린 것 같다.

이렇게 한번 고생해서 해놓으면 다음엔 실행만 하면 내가 원하는 결과를 얻을 수 있는게 파이썬으로 스크립트를 만드는 것의 장점이다.

 

 

엑셀을 이용했을 때

 

1. 재고관리 프로그램에서 재고 데이터를 내려받는다. 

제품명 위치 갯수
제왕의 의자 warehouse 2
예수침대 warehouse 1
힘들어 침대 warehouse 1
밤의 왕 침대 warehouse 0
바바리안 책상 warehouse 0
제왕의 의자 display 0
바바리안 책상 display 1
힘들어 침대 display 1
밤의 왕 침대 display 0
예수침대 display 0

내려받아진 CSV 데이터의 형식은 위와 같다.

 

Quiz. 매장에 진열이 가능한 제품은 무엇들 인가?

 

진열이 가능한 제품을 찾는데 얼마나 걸렸는가?

만일 내려 받아진 데이터가 아래와 같으면 매장 진열이 필요한 제품을 쉽게 찾을 수 있을텐데... 아쉽게도 데이터를 그렇게 전달해 주지 않는다.

 

제품명 창고 매장
제왕의 의자 2 0
예수침대 1 0
힘들어 침대 1 1
밤의 왕 침대 0 0
바바리안 책상 0 1

 

 

2. 새로운 시트를 만든 뒤 제품명들을 복사해 넣는다.

 

3. 중복되는 이름을 제거한다.

 

4. 창고와 매장의 열에 SUMIFS 함수를 사용하여 위와 같은 테이블을 만든다. 

 

5. 필터를 사용하여 매장의 0 창고의 0 이상인 것들을 선택한다.

 

 

물론 어렵지는 않다. 그냥 번거롭고 쓸때 없는 시간이 소비될 뿐이다. 직원한테 이미 공식이 있는 포맷을 만들어서 

그 포멧에 맞게 데이터를 껴 넣기만 하라고 해도 컴퓨터가 버벅거리고 귀찮아서 잘 안한다.

그러면.... 우리가 팔아야 할 제품은 창고에서 세상밖으로 나오질 못하게 된다. 

 

 

 

파이썬을 사용했을 때

1. 엑셀을 다운 받는다.

2. 주피터노트북을 실행한다.

3. 코드를 실행한다.

 

아래의 데이터가 

제품명 위치 갯수
제왕의 의자 warehouse 2
예수침대 warehouse 1
힘들어 침대 warehouse 1
밤의 왕 침대 warehouse 0
바바리안 책상 warehouse 0
제왕의 의자 display 0
바바리안 책상 display 1
힘들어 침대 display 1
밤의 왕 침대 display 0
예수침대 display 0

이런 형태로 변환이 된다.

제품명 창고 매장
제왕의 의자 2 0
예수침대 1 0
힘들어 침대 1 1
밤의 왕 침대 0 0
바바리안 책상 0 1

 

 

댓글()

[1. 엑셀 대신 파이썬: 재고찾기 프로그램] 주피터 설치 및 실행

Computer 관심/Pandas|2020. 7. 18. 18:20
반응형

매장을 관리할때 창고에 제고가 있음에도 불구하고 제품이 디스플레이가 되지 않는 경우가 있다.

 

제품명: 왕의 의자

디스플레이: 0

창고: 3

 

지금까지는 제고관리 프로그램에서 제공하는 엑셀 파일을 사용해서 디스플레이가 되지 않는 상품을 찾아내곤 했다.

'제품의 디스플레이가 0개 and 창고에 있는 수 >1' 를 찾으면 되는 것이다. 

 

1)

product_name display warehouse
왕의 의자 0 3

엑셀에 경우 필터를 사용하여 werehouse에 0만 제외 시키고 모두 체크하고 display는 0만 체크 해놓으면 디스플레이가 되지 않은 제품들을 찾아 낼 수 있다.

 

하지만 문제는 엑셀이 이렇게 제공 되는 경우이다.

 

2)

product_name location warehouse
왕의 의자 display 0
왕의 의자 warehouse 3

엑셀에선 sumifs를 사용해서 2번 모양의 테이블을 1번처럼 만들 수 있다. 하지만 제고를 체크 할 때 마다 이러한 일을 반복해야 한다는 것이 너무 번거로웠다.

 

그래서 엑셀 대신 파이썬 & 주피터 노트북를 사용하여 디스플레이가 가능한 제고를 찾아내 보려고 한다.

 

 

1. 주피터노트 설치하기

pip install notebook

파이썬을 설치한 뒤 커맨드창에 위와 같이 입력한다.

 

2. 폴더 만들기

 

3. 만든 폴더에 들어가서 파일 경로 창에 cmd 실행하기

 

4. 주피터 노트북 실행하기

jupyter notebook

실행하면 위와 같이 브라우저에서 주피터 노트북이 실행된다.

 

3. New를 클릭하여 Python 3 노트북을 실행시킨다.

4. 이제 In [ ] 옆의 필드에 코드를 입력을 해보자

 

댓글()

Visual studio code에서 indentation 일괄적용

Computer 비관심/PyQt5|2019. 9. 22. 18:54
반응형

개발회사에서 장고로 웹사이트를 개발할 때는 pycharm을 이용해서 개발을 했다. 개인적으로 난 pycharm을 좋아하지 않았다. 프로그램 자체가 무겁다는 느낌이 많이 들었기 때문이다. 그때 아톰에디터도 유행 하고 있었는데 가볍고 좋았는데 이상한 잔버그들이 있었다. 

 

visual studio code를 알게 되고 visual code로 자바스크립트를 코딩을 했는데 배경, 폰트, 속도 전부다 만족스러웠다.

정말 최고의 에디터라고 말할 수 있다.

 

내가 파이썬을 좋아하고 파이썬 개발자가 되었던 이유는 파이썬이 정말 간결했기 때문이다.

하지만 visual studio code를 사용할 때 마다 인덴테이션 문제가 발생하였다.

 

 

문제 해결 방법

Space:4로 바꾸어 준다. pep8 ( 코딩스텐다드 )에서 인덴테이션을 스페이스바 4개로 권장하고 있기 때문에 탭을 클릭 했을때 스페이스바 4개가 적용이 되도독 설정한 것이다. 

 

 

 

그 결과 탭 클릭시 깔끔한 인덴테이션을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

하지만 이건 일시적인 방법일 뿐이다. 다시 에디터를 열게되면 탭의 space가 2가 되버린다.

그럼 기본세팅 자체를 바꿔보자.

 

1. shift + ctr + p를 누른다.

2. open user settings를 검색한다.

3. indent를 검색한다.

4.Tab size - the number of spaces a tab is equal to. (한번의 탭이 얼마의 스페이스와 같은지를 설정하는 것이다.)

tab size란의 숫자를 아래 스크린 샷 처럼 4로 바꾸어준다.

 

댓글()

PyQt에 firestore 연결하고 exe 파일로 만들기 (2)

Computer 비관심/PyQt5|2019. 9. 14. 01:11
반응형

파이어베이스와 PYQT의 조화는 잘 사용하지 않는지 자료가 그다지 많지 않았다.

디버깅 하는 스스로 만들어내고 PYQT와 FIREBASE에서 발생하는 버그의 해결책들을 찾는데 시간이 오래걸렸다.

 

 

PyQ에 firestore연결하고 exe 파일 만들기- 파이어스토어 파이썬에 연동하는법(1)

https://infocentre.tistory.com/45 

 

 

1. 파이인스톨러 사용

 

(1) 파이인스톨러(pyinstaller)를 사용한다. 

- 파이인스톨러의 간단한 사용 방법은 이전 글에 적어 두었다. 

https://infocentre.tistory.com/3

 

2. 디버깅 (디버깅을 쉽게 하는 방법을 모르면 개고생합니다.)

 

(1). 파일인스톨러를 사용할때 디버깅을 위해서 처음엔 -w 플레그를 붙이지 않고 실행 파일을 만든다.

-w 플래그를 붙이면 console창이 나오지 않아서 어떤 버그가 발생했는지 알기 힘들다. 이렇게 해야 하는 이유는 잘 동작하던 파이썬 큐티프로그램이 exe파일로 만들면 실행이 안되는 경우가 있기 때문이다.

 

(2)try except 구문을 잘 이용한다. 

try:
	#실행할 코드 넣기~
    
except Exception as e: 
	print(e) #에러를 표시하기 위해서
	input() #멈추게 하기 위해서

 

이 구문은 app.exec_() 이전에 써 넣어야 디버깅 화면이 꺼지지 않는다.

 

3. 이렇게 해서 디버깅을 해보면 The 'google-cloud-firestore' distribution was not found and is required by the application 라는 에러가 나온다.

 

- 파이썬 인스톨러가 구글클라우드 파이어베이스 스토어를 실행 시키지 않는것이다. 그래서 훅을 만들어준다.

\Lib\site-packages\PyInstaller\hooks 에 들어가서 hook-google.cloud.py 파일에 아래 코드를 추가해준다.

 

datas += copy_metadata('google-cloud-firestore')

 

 

4. 그리고 다시 실행해보면 잘 되거나 아니면 이런 버그가 발생한다.

Exception ignored in: 'grpc._cython.cygrpc.ssl_roots_override_callback'
E0913 23:26:43.750000000  9436 src/core/lib/security/security_connector/ssl_utils.cc:448] assertion failed: pem_root_certs != nullptr

 

이번엔 hooks폴더에  hook-grpc.py를 만들고 아래와 같은 코드를 넣는다.

 

from PyInstaller.utils.hooks import collect_data_files

datas = collect_data_files('grpc')

 

작동한다! 

 

참조: https://stackoverflow.com/questions/55848884/google-cloud-firestore-distribution-doesnt-get-added-to-pyinstaller-build

 

5. pyqt5 5.13 버전과 파이인스톨러를 같이 사용할 경우 다른 컴퓨터로 옮겼을때 작동이 안될 수 있다.

에러 - ImportError: unable to find Qt5Core.dll on PATH

- 이 경우 가장 쉬운 해결 방법은 이전 버전으로 다운그레이드 하는 것이다.

pip install pyqt5==5.12.2

 

참조 : https://stackoverflow.com/questions/56949297/how-to-fix-importerror-unable-to-find-qt5core-dll-on-path-after-pyinstaller-b

 

 

 

 

 

 

 

 

댓글()