1.19 python가상환경 + flask 연습

hun2__2·2022년 1월 19일
0

Have a fruitful vacation

목록 보기
20/24

파이썬을 설치하고 여러가지 작업들을 할때 라이브러리가 업데이트되면서 호환이 안 될 수 있다.
그러면 이전 라이브러리로 매번 다시 설치해야되는 번거로움이 발생하는데

파이썬에서는 이를 해결하주는 방법으로 가상환경이라는 개념을 사용한다.

가상환경안에 필요한 라이브러리를 설치함으로써 다른 파일에 영향을 미치지않고 가상환경에서만 필요한 라이브러리가 설치되는것이다.

그리고 이를 더 편리하게 해주는 anaconda 라는 프로그램이 있다

이를 이용해서 가상환경을 설치 및 관리하는 방법을 공부해보고 이 안에서 flask를 연습해볼 것이다.

먼저 아나콘다를 설치해주고

가상환경을 생성해준다.
conda create -n 가상환경이름 python=버전

그러면 Anaconda3/envs/ 경로 안에 내가 설치한 가상환경 파일이 생성된다.

이제 가상환경을 활성화해준다.
conda acrivate 가상환경이름

default 가상환경인 base로 되어있던게 활성화 해준 가상환경으로 변경되는 것을 볼 수 있다.

가상환경 활성화를 꺼주고 싶으면
conda deactivate를 이용해서 base로 돌아갈 수 있다.

이제 가상환경에 내가 필요한 라이브러리들을 설치하면된다.
conda install 라이브러리

이렇게 셋팅 다 되었다!

cf1) 생성한 가상환경 list를 볼 수 있는 방법은 cmd에 명령어로
conda env list로 볼 수 있다.

cf2) 똑같은 환경이 필요할때 모두 새로 설치할 필요없이 가상환경을 복사하면 된다.
conda create -n 복사된가상환경이름 --clone 복사할가상환경이름

cf3) 가상환경 삭제
conda remote -n 가상환경이름 --all

cf4) 가상환경 라이브러리 관리
가상환경에서 pip freeze > requirements.txt 를 입력하면 설치된 라이브러리 목록을 requiremeants.txt 파일에 저장한다.

(참고: https://yganalyst.github.io/pythonic/anaconda_env_1/)




다음으로 flask를 사용하는 방법이다.

먼저 가상환경에 conda install Flask로 설치해주고
from flask import Flask 로 Flask 모듈을 불러와서

app = Flask('appName')

app.run(host = '127.0.0.1')을 해주면
내가만든 가상환경에 호스트로 들어갈 수 있다.
그러면 웹서버가 하나 만들어지고 그안에 host로 들어가진다.

  1. route 만들기

이제 react에서 라우터를 만들어 주는것처럼
@app.route('/') 를 이용해서 라우터를 만들어 줄 수 있다. @는 데코레이터로 @요청이 들어오면 바로 아래있는 함수를 실행시킨다.
따라서

@app.route('/contact')
def contact():
    return 'Contact me!'

이런식으로 /contact에 들어왔을때 contact()함수를 실행시킨다 (이름이 같을 필요는 없음)

  1. dynamic URLs

dynamic URL은 url로 어떤 수가 들어왔는지를 변수로 받아서 사용할 수 있다.

@app.route('/<username>')
def username(username):
    return f"Hello your name is : {username}"

  1. template사용하기

return으로 html코드를 적기 너무 힘드니 html파일을 만들어서 파일을 return해주는 방법으로 사용한다.
먼저 templates 라는 폴더를 만들어주고 그 안에 html파일을 작성하고

flask에서 render_template 모듈을 불러와 연결시켜준다.

# ! 다른 파일불러와서 띄워주기
@app.route("/")
def home():
    return render_template('home.html')
  1. user input 값 이용하기 (query arguments)

html에 form을 작성하고 action=""으로 이동할 라우터를 정하고 method="get|post"로 방식을 정하고 name=""을 정해주면

    <form action="/search" method="get">
      <input placeholder="어떤 직업을 찾고싶으세요?" required name="word" />
      <button>Search</button>
    </form>

이렇게 url로 정보를 보내주고
url의 값을 flask의 request모듈로 받아서 쓸 수 있다.
사용자가 대문자로 적었을 경우 소문자로 바꿔주고 입력을 안했을 경우 다시 '/'으로 리다이렉트 시켜주는 과정까지 해주기 위해 아래와 같이 적을 수 있다.

# ! query arguments : request.args를 사용해서 안에 뭐가 있는지 뽑아올 수 있다.
@app.route('/search')
def search():
    # print(request.args.get('word'))
    word = request.args.get('word')
    if word:
        word = word.lower()
    else:
        return redirect('/')
    return render_template('search.html', searchingBy=word)

받아온 값을 다시 html로 보내줄때는 html안에 {{변수명}}을 사용해서 쓸 수 있다.

  <body>
    <h1>search Results</h1>
    <h3>당신은 {{searchingBy}}을 찾으셨습니다.</h3>
  </body>

이제 이걸 이용해서 어제 만든 stackOverFlow에서 일자리 search하는 작업을 해볼 것인데 어제만든 파일을 긁어와 가상환경에 넣어주고
간단하게 db용으로 쓸 빈obj를 라우터 밖에 만들어서 search한 결과를 넣어준다. 이렇게 해줌으로 같은 word를 검색할때 처음만 search하고 그 다음부터는 db안에 있는 데이터를 바로 보여준다.

db = {}

@app.route('/search')
def search():
    # print(request.args.get('word'))
    word = request.args.get('word')
    if word:
        word = word.lower()
        fromDb = db.get(word)
        if fromDb:
            jobs = fromDb
        else:
            jobs = get_stackOverFlow_jobs(word)
            db[word] = jobs
    else:
        return redirect('/')
    return render_template('search.html', searchingBy=word, resultsNumber=len(jobs), jobs=jobs)

그리고 html에도 긁어온 정보가 뜰 수 있게 jobs라는 변수에 data를 넣어주고 html에서 {% python문법 %}을 사용해서 for문을돌려준다.

  <body>
    <h1>search Results</h1>
    <h3>당신은 {{searchingBy}}을 찾으셨습니다.</h3>
    <h4>결과가 {{resultsNumber}}개 있습니다.</h4>
    <a href="/export?word={{searchingBy}}">export to CSV</a>
    <section>
      <h4>Title</h4>
      <h4>Company</h4>
      <h4>Location</h4>
      <h4>Link</h4>
      {% for job in jobs%}
      <span>{{job.title}}</span>
      <span>{{job.company}}</span>
      <span>{{job.location}}</span>
      <a href="{{job.link}}" target="_blank">Apply</a>
      {% endfor%}
    </section>
  </body>

이제 받아온 데이터를 띄워주었으니 다운로드 받을 수 있는 기능을 넣어준다. 다운로드 받는 라우터를 만들어서 라우터에 들어갔을떄 파일을 다운로드 하도록 만들어준다

먼저 다운로드 받는 라우터로 들어가지는 a태그를만들고
<a href="/export?word={{searchingBy}}">export to CSV</a> 이 안에 들어가면 다운로드가 받아지도록 flask의 send_file을 사용해서 구현한다.

# ! 파일 다운로드
@app.route('/export')
def export():
    try:
        word = request.args.get('word')

        if not word:
            raise Exception()

        word = word.lower()
        jobs = db.get(word)
        if not jobs:
            raise Exception()
        save_to_file(jobs)
        return send_file('jobs.csv')
    except:
        return redirect('/')

이로써 파일 받는것까지 완성!

이제 챌린지를 해보면서 익히자!!

ps. 미루고미루던 크롤링을 이제 해본다... 앞으로 여러개 검색해야할 일 있으면 굳이굳이 스크래핑으로 검색해서 알아보자...!!(연습해야지)
그리고 애매하게 알던 가상환경에대해서도 한번 다시 정리가 되었다!!

profile
과정을 적는 곳

0개의 댓글