Google Sheets, S3, Python을 사용하여 빠른 웹 사이트 구축

22218 단어 pythonawstutorial
이 문장은 나의 후속 문장인데, 나는 단지 창고만 이야기했다.
이 강좌에서는 Google Sheets에서 데이터를 읽고 미리 정의된 템플릿으로 정적 사이트를 생성하여 S3 bucket에 배치하는 스크립트를 설정합니다.본고는 웹 개발에 대해 아는 것이 매우 적고 무언가를 신속하게 실행하고자 하는 프로그래머를 대상으로 한다.
이 강좌는 요구 사항, 코드 보기 및 Jinja 템플릿, Google Sheets API 사용, 사이트 구축 및 배포 등 다섯 가지 섹션으로 구성됩니다.

요구 사항


이것들은 네가 스스로 설정하거나 검사해야 한다.나는 이 때문에 약간의 링크를 추가했다.
  • Python >= 3.7
  • Google account
  • Google Cloud Platform (GCP) account
  • Amazon AWS account

  • AWS CLI(가능use brew if you have a Mac
  • 한 점HTMLCSS
  • 코드 및 Jinja 템플릿


    먼저 my_pokemon_stats 라는 디렉터리를 만들고 터미널을 엽니다.그런 다음 다음과 같이 가상 환경을 만들고 필요한 패키지를 설치합니다.
    python3 -m venv venv
    source venv/bin/activate
    pip3 install boto3 gspread jinja2 oauth2client
    
    다음은 이 두 파일을 다운로드하고 저장합니다: template.htmlsite_builder.py.이것은 사이트를 생성하는 구축 블록입니다.template.html 사이트를 구축하는 데 사용할 Jinja 템플릿입니다.이것은 파이썬에서 처리할 논리를 추가하고 최종 사이트를 생성할 수 있는 HTML과 유사한 파일입니다.이 파일은 다음과 같습니다.
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet"
              integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
        <title>My Pokemon Stats</title>
    </head>
    <body>
    
    <header id="header">
        <div class="container text-center">
            <h1 class="pt-5 pb-1 font-weight-bold">
                My Pokemon Stats
            </h1>
            <hr>
            <p class="pt-2">
                This is a site I use to store the stats of all my Pokemon.
            </p>
        </div>
    </header>
    
    <section id="pokemon_table">
        <div class="container py-4">
            <div class="table-responsive">
                <table class="table table-hover">
                    <thead class="thead-dark">
                    <tr>
                        <th scope="col">Name</th>
                        <th scope="col">Type 1</th>
                        <th scope="col">Type 2</th>
                        <th scope="col">Total</th>
                        <th scope="col">HP</th>
                        <th scope="col">Attack</th>
                        <th scope="col">Defense</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for row in data %}
                    <tr>
                        <td>{{ row["Name"] }}</td>
                        <td>{{ row["Type 1"] }}</td>
                        <td>{{ row["Type 2"] }}</td>
                        <td>{{ row["Total"] }}</td>
                        <td>{{ row["HP"] }}</td>
                        <td>{{ row["Attack"] }}</td>
                        <td>{{ row["Defense"] }}</td>
                    </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </section>
    </body>
    </html>
    
    그것을 분해합시다.
  • 레이블의 대부분을 무시할 수 있습니다.이것은 표준 HTML5 코드입니다. 대부분의 페이지에서 볼 수 있습니다.그러나 우리는 두 가지 재미있는 라벨 <head><link> 을 자세히 볼 것이다.
  • 이 경우 <title> 태그는 구성 요소 라이브러리를 가져오는 데 사용됩니다.우리는 그것을 사용하여 페이지의 다른 부분에 간단한 스타일을 정의하고 그것을 보기 좋게 할 것이다. 너무 많은 노력을 기울일 필요가 없다.<link> 페이지의 제목(브라우저 탭에서 본 내용)을 정의하여 검색 엔진 최적화와 소셜 미디어 공유에 매우 유용합니다.
  • 다음으로 <title> 라벨에 <header> 부분이 있습니다.이것은 우리가 페이지에 나타날 텍스트를 정의하는 곳이다.다음 그림과 같습니다.안내선의 표준 스타일을 사용하여 텍스트를 가운데에 배치하고 채우기를 추가했습니다.
  • Bootstrap
  • 마지막으로 우리는 <body>를 얻었다.<section id="pokemon_table"><div> 표기는 표 구축에 기본적인 양식을 제공했다.다음은 <table> 표기 안에 표의 제목을 정의합니다.<thead> 라벨 안에 김가가 마법을 펼치는 곳
  • <tbody>는 포켓몬의 줄마다 데이터를 통해 순환하는 것이다.각 {% for row in data %} 에서는 필드에서 각 행에 대한 정보를 얻습니다(예: 이름, 유형 1, 유형 2).그러면 다음과 같은 내용이 생성됩니다.

  • 다음은 <td>{{ row["..."] }}</td> 파일입니다.이 스크립트는 Google Sheets에서 포켓몬 데이터를 다운로드하여 데이터와 site_builder.py 파일을 처리한 다음 생성된 파일을 S3 저장소에 업로드합니다.
    import csv
    
    import boto3
    import gspread
    import jinja2
    from oauth2client.service_account import ServiceAccountCredentials
    
    AWS_PROFILE = "INSERT-AWS-PROFILE-HERE"
    BUCKET = "INSERT-BUCKET-NAME-HERE"
    WORKBOOK = "INSERT-WORKBOOK-NAME-HERE"
    
    
    def download_data():
        """Download data using the Google Sheets API"""
        scope = [
            "https://spreadsheets.google.com/feeds",
            "https://www.googleapis.com/auth/drive",
        ]
        credentials = ServiceAccountCredentials.from_json_keyfile_name(
            "credentials.json", scope
        )
        client = gspread.authorize(credentials)
    
        worksheet = client.open(WORKBOOK).get_worksheet(0)
        sheet_values = worksheet.get_all_values()
    
        print(f"Downloading: {worksheet.title}")
        with open("my_pokemon_stats.csv", "w") as f:
            writer = csv.writer(f)
            writer.writerows(sheet_values)
    
    
    def generate_site():
        """Generate site in local directory"""
        print("Process data and build site")
    
        template_loader = jinja2.FileSystemLoader(searchpath="./")
        template_env = jinja2.Environment(loader=template_loader)
        template = template_env.get_template("template.html")
    
        with open("my_pokemon_stats.csv") as csv_file:
            csv_reader = csv.DictReader(csv_file)
            data = [row for row in csv_reader]
    
        output = template.render(data=data)
    
        with open("index.html", "w") as f:
            f.write(output)
    
    
    def deploy_site():
        """Deploy site S3 bucket"""
        print("Upload data to S3")
        session = boto3.Session(profile_name=AWS_PROFILE)
        s3 = session.resource("s3")
        s3.Bucket(BUCKET).upload_file(
            Filename="index.html", Key="index.html", ExtraArgs={"ContentType": "text/html"}
        )
    
    
    if __name__ == "__main__":
        download_data()
        generate_site()
        deploy_site()
    
    코드는 3개의 함수로 구성되어 있다. template.html, download_sheets, generate_site.다음 섹션에서는 AWS 및 Google Sheets API 액세스에 대해 자세히 설명합니다.

    Google Sheets API 사용


    다음 절차에 따라 Google Sheets API를 사용하여 포켓몬 데이터를 다운로드합니다.
  • Google Sheets에서 워크북을 작성합니다(내 것을 복사할 수 있습니다:
  • 이동 My Pokemon Stats
  • My Pokemonstats라는 새 프로젝트를 만듭니다.
  • API 및 서비스 활성화 를 클릭합니다.Google Sheets API를 검색하고 활성화합니다.
  • 로 돌아가 API 및 서비스 활성화 를 다시 클릭합니다.이제 Google Drive API를 검색하여 활성화합니다.
  • 자격 증명 생성 클릭*다음 4가지 질문은 * 구글 드라이버 API, 웹 서버(예: node.js, Tomcat), * 응용 프로그램 데이터, * 및 * 아니요, 사용하지 않았습니다. *
  • 필요한 자격 증명 클릭*서비스 계정의 이름 (예: 데이터 가져오기) 을 선택하고 * 프로젝트 편집기 역할을 부여합니다.키 유형에 대한 JSON 옵션 선택
  • 대화 상자가 열립니다.JSON 파일을 저장하여 deploy_site 디렉토리로 복사하고 이름을 my_pokemon_stats 로 변경합니다.
  • 파일을 엽니다.credentials.json라는 키를 찾아 값을 복사합니다(예: Google APIs Console...).Google Sheets의 워크북으로 돌아가서 오른쪽 상단에 있는 공유 버튼을 클릭하여 클라이언트 전자 메일을 연락처 필드에 붙여 편집 권한을 부여합니다.클릭하여 발송합니다.
  • 스크립트로 이동하여 credentials.json 변수를 1단계에서 워크북에 지정한 이름으로 설정합니다.
  • 구글 API 콘솔 S3 bucket 및 AWS 관련 구성 설정


    이제 S3 bucket을 만들고 코드를 프로그래밍 방식으로 AWS에 액세스하도록 구성합니다.
  • 이동 get-data@iam
  • S3 스토리지 배럴 생성
  • bucket에 들어간 후 Properties를 누르고 Static website hosting
  • "이 스토리지 버킷 관리 웹 사이트 사용"옵션 선택
  • 색인 파일 및 오류 파일에 배치client_email
  • 끝에 대한 URL을 저장합니다.이 URL을 사용하여 웹 사이트에 연결합니다.
  • 권한으로 이동하고 편집을 클릭합니다.
  • 모든 공통 액세스 차단을 지우고 저장을 선택한 다음 확인합니다.당신이 이것을 변경할 때, 인터넷상의 누구든지 이 통의 내용을 방문할 수 있다.이것은 네가 원하는 것이다. 네가 사이트를 발표할 때, 그러나 어떤 개인적인 것도 내놓지 마라.
  • 이제 Bucket Policy로 이동하여 다음 정책에서 Bucket 이름을 바꾸어 붙여넣고 Save를 클릭합니다.
  • {
      "Version":"2012-10-17",
      "Statement":[{
        "Sid":"PublicReadGetObject",
            "Effect":"Allow",
          "Principal": "*",
          "Action":["s3:GetObject"],
          "Resource":["arn:aws:s3:::BUCKET-NAME-HERE/*"
          ]
        }
      ]
    }
    
  • 스크립트로 이동합니다.변수site_builder.py를 AWS에 액세스하는 데 사용할 프로필 이름으로 설정합니다(UNIX 시스템에서는 WORKBOOK의 프로필 중 하나여야 합니다.).
  • 사이트 구축 및 배포


    마지막으로 프로젝트의 루트 폴더 index.html 에서 사이트를 생성할 수 있어야 합니다.Google Sheets에서 데이터를 다운로드하고 Jinja 처리site_builder.py 파일을 사용하여 S3 bucket에 사이트를 업로드합니다.
    사이트를 확인하려면 끝 URL로 이동합니다(이전 단계 6).

    Amazon S3 콘솔 끝말


    이런 방법은 결코 완벽하지는 않지만, 당신이 신속하게 물건을 발송하는 것을 도울 수 있습니다.나는 이 전략을 사용하여 구축 하였는데, 효과가 매우 좋다.4월 1일부터 4월 16일까지 이 사이트에는 15000여 명의 방문객이 있는데 이것은 내가 가장 낙관적인 기대를 초과했다.

    이 사이트는 서서히 죽음으로 향하고 있다.그러나 이 과정은 나에게 시간을 낭비하지 않고 완벽한 도구를 찾는 것이 얼마나 중요한지 가르쳐 주었다.나는 아주 빨리 이 사이트를 세웠는데, 사람들은 모두 매우 좋아한다. 첫날 이후, 그 데이터는 내가 지금까지 한 어떤 보조 항목도 초과했다.완벽은 선의 적이다. 이것은 정말이다.
    내 예에서, 나는 스타일 디자인과 배치를 위해 스크립트에 더 많은 기능을 추가해야 한다.관심이 있으시면 mystayhomeandlearn.org의 코드를 보실 수 있습니다.또는 의 다른 글을 참조하십시오.
    마지막으로 당신의 사이트를 더욱 재미있게 하기 위해서 당신은 지금 몇 가지 일을 할 수 있습니다.
  • GitHub repository
  • my site
  • 도메인 및 SSL 인증서 가져오기 공구서류


    [1] G.Bauges,Make it look better!(2017)
    [2] V.Drake,H (2017)
    [3] A.Barradas,Google Spreadsheets and Python(2016)

    좋은 웹페이지 즐겨찾기