Tag Archives: flask

[Python] Flask로 파일 업로드 후 읽기

급하다 급해

Python에서

from werkzeug.utils import secure_filename

@app.route("/uploadText", methods=['POST', 'GET'])
def upload_Text():

    if request.method == 'POST':
        file = request.files['file']
        if file:
            data = file.read().decode('utf-8')
            filename = secure_filename(file.filename)
        else:
            return home()

html에서

<form role="form" method="post" enctype="multipart/form-data" action="/uploadText">
        <label for="name">{{file_name}}</label>
        <div>
            <button type="submit" class="btn btn-default" aria-label="Left Align" style="float:right">
             <span class="glyphicon glyphicon-upload" aria-hidden="true"> Upload</span>
            </button>
            <input name="file" type="file" class="filestyle" data-buttonName="btn-primary" style="float:left">
        </div>
       <div class = "form-group" >
          <textarea class = "form-control" rows = "20">{{text_data}}</textarea>
       </div>
    </form>

 

[Python] 서울시열린데이터 – 서울시 공공 와이파이정보 파이썬으로 갖고 놀기(2)

이거의 두번째 시간이다. 사실 이거를 할 생각은 없었는데, Flask를 하게 되면서 이걸 좀더 심도 있게 가지고 놀 수 있게 되었다.

from flask import (Flask, render_template)
import pandas as pd

app = Flask(__name__)


@app.route("/")
def home():
    map_path = "seoulwifi.csv"
    data = pd.read_csv(map_path, index_col=None, header=1)
    data.columns = (['구', '유형', '위치명', 'lat', 'lon', '설치회사'])

    # 서울 중심
    seoul_center = {
        "lat": 37.541,
        "lon": 126.986,
        "zoom": 13
    }
    result_data = []
    for index, row in data.iterrows():
        rounded_lat = round(row.lat, 8)
        rounded_lon = round(row.lon, 8)
       # 거지같은 코드 추가
        if rounded_lat > rounded_lon:
            temp = rounded_lat
            rounded_lat = rounded_lon
            rounded_lon = temp

        data = {
            "marker_text": row.위치명 + " by " + row.설치회사,
            "lat": rounded_lat,
            "lon": rounded_lon
        }
        result_data.append(data)

    return render_template("seoul.html", data=result_data, center=seoul_center)


if __name__ == "__main__":
    app.run(port=5555, debug=True)

정보를 가져와서 파싱하는 것 까지는 전과 똑같다.

다만 몇가지 골 때렸던건, 파싱할때는 몰랐던 건데, 일부 x, y 좌표 (lat, lon)가 뒤집혀서 제공되고 있었다는 것.

지도에 마커가 안떠서 한참이나 고생했는데, 설마 그런 이유 때문인지는 몰랐다.

<!DOCTYPE html>
<html>
  <head>
    <title>Seoul WIfI map</title>
    <meta name="viewport" content="initial-scale=1.0">
    <meta charset="utf-8">
      <style>
          #map {
            height: 800px;
          }
      </style>
  </head>
  <body>
    <h1> Seoul Public Wifi Map </h1>
    <div id="map"></div>
    <script>
    var map;
    var marker;
    function initMap() {
      map = new google.maps.Map(document.getElementById('map'), {
        center: {lat: {{center.lat}}, lng: {{center.lon}}},
        zoom: {{center.zoom}}
      });
      placeWIFI({{data | safe}})

    }
    function placeWIFI(data){

      for (i = 0; i < data.length; i++){
        marker = new google.maps.Circle({
          center: new google.maps.LatLng(data[i].lat, data[i].lon),
          title: data[i].marker_text,
          map: map,
          radius:50,
          strokeColor:"#5A0001",
          strokeOpacity:0.8,
          strokeWeight:1,
          fillColor:"#F45B69",
          fillOpacity:0.6
        })
        # 마우스 오버 아웃이벤트
        google.maps.event.addListener(marker,'mouseover',function(){
             this.getMap().getDiv().setAttribute('title',this.get('title'));});

        google.maps.event.addListener(marker,'mouseout',function(){
             this.getMap().getDiv().removeAttribute('title');});
      }
    }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_APU_KEY" async defer></script>
  </body>
</html>

마커 대신에 원을 그렸다. 보통 와이파이가 50m 까지 영향을 미친 다고 하니까, 그래서 radius를 50으로 설정했다.

그리고 Google 맵의 circle마커는 마우스 오버 이벤트(마커의 타이틀을 보여주는 것) 가 없기 때문에 수동으로 오버와 아웃이벤트를 위와 같이 추가해줘야 한다.

결과

seoulwifimap

마우스 올리면 타이틀도 뜹니다.

캡쳐를 못해가지고 그렇지.

[Python – Flask] 플라스크에서 쿠키 사용하기

플라스크는 Python 마이크로웹프레임워크다. 가볍고, 확장성도 뛰어나고,  무엇보다 굉장히 배우기 쉽다.
그래서 요즘 요래저래 플라스크를 하고 있는데, 관련해서 알게 된 것을 포스팅 하고자 한다.

먼저 플라스크에서 쿠키를 사용하는 방법이다.

쿠키 설정하는 법

@app.route("/")
def home():    
    response = make_response(render_template("index.html"))
    # 오늘로 부터 365일
    expired_date = datetime.datetime.now() + datetime.timedelta(days=365)
    # 쿠키 설정
    response.set_cookie("쿠키명", 저장할데이터, expires=만료일자)
    response.set_cookie("city", city, expires=expired_date)

    return response

 

응답을 할 response에  set_cookie 메소드를 호출하여 적절하게 채워넣으면 된다.

쿠키 가져오는 법

def get_cookie(key):
    return request.cookies.get(key)

 

짱짱쉬워영