generated from prof-rossetti/flask-sheets-template-2023
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 8f0733a
Showing
33 changed files
with
1,852 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# This workflow will install Python dependencies, run tests and lint with a single version of Python | ||
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | ||
|
||
name: Python application | ||
|
||
on: | ||
push: | ||
branches: [ main ] | ||
pull_request: | ||
branches: [ main ] | ||
|
||
jobs: | ||
build: | ||
|
||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v3 | ||
|
||
# USE OFFICIAL GOOGLE ACTION TO CREATE A CREDENTIALS JSON FILE | ||
# ... https://github.com/google-github-actions/auth | ||
- id: 'auth' | ||
name: 'Authenticate to Google Cloud' | ||
uses: 'google-github-actions/auth@v0' | ||
with: | ||
# uses this encrypted secret set via github repo settings | ||
# which is essentially a copy of the JSON credentials file contents (for the dev project) | ||
credentials_json: '${{ secrets.GOOGLE_API_CREDENTIALS }}' | ||
# this will create a credentials file with a randomized name | ||
create_credentials_file: true | ||
|
||
- name: Set up Python 3.10 | ||
uses: actions/setup-python@v3 | ||
with: | ||
python-version: "3.10" | ||
|
||
- name: Install dependencies | ||
run: | | ||
python -m pip install --upgrade pip | ||
pip install flake8 pytest | ||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi | ||
- name: Lint with flake8 | ||
run: | | ||
# stop the build if there are Python syntax errors or undefined names | ||
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics | ||
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide | ||
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics | ||
- name: Test with pytest | ||
env: | ||
# access path of credentials file created by earlier auth step: | ||
#GOOGLE_APPLICATION_CREDENTIALS: ${{ steps.auth.outputs.credentials_file_path }} | ||
GOOGLE_CREDENTIALS_FILEPATH: ${{ steps.auth.outputs.credentials_file_path }} | ||
run: | | ||
CI=true TEST_SLEEP=20 pytest |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
|
||
*.DS_Store | ||
|
||
# Ignore Google Service Account credentials JSON file(s) | ||
google-credentials.json | ||
google-credentials-prod.json | ||
*-credentials.json | ||
google-credentials*.json | ||
|
||
|
||
|
||
|
||
# Byte-compiled / optimized / DLL files | ||
__pycache__/ | ||
*.py[cod] | ||
*$py.class | ||
|
||
# C extensions | ||
*.so | ||
|
||
# Distribution / packaging | ||
.Python | ||
build/ | ||
develop-eggs/ | ||
dist/ | ||
downloads/ | ||
eggs/ | ||
.eggs/ | ||
lib/ | ||
lib64/ | ||
parts/ | ||
sdist/ | ||
var/ | ||
wheels/ | ||
pip-wheel-metadata/ | ||
share/python-wheels/ | ||
*.egg-info/ | ||
.installed.cfg | ||
*.egg | ||
MANIFEST | ||
|
||
# PyInstaller | ||
# Usually these files are written by a python script from a template | ||
# before PyInstaller builds the exe, so as to inject date/other infos into it. | ||
*.manifest | ||
*.spec | ||
|
||
# Installer logs | ||
pip-log.txt | ||
pip-delete-this-directory.txt | ||
|
||
# Unit test / coverage reports | ||
htmlcov/ | ||
.tox/ | ||
.nox/ | ||
.coverage | ||
.coverage.* | ||
.cache | ||
nosetests.xml | ||
coverage.xml | ||
*.cover | ||
*.py,cover | ||
.hypothesis/ | ||
.pytest_cache/ | ||
|
||
# Translations | ||
*.mo | ||
*.pot | ||
|
||
# Django stuff: | ||
*.log | ||
local_settings.py | ||
db.sqlite3 | ||
db.sqlite3-journal | ||
|
||
# Flask stuff: | ||
instance/ | ||
.webassets-cache | ||
|
||
# Scrapy stuff: | ||
.scrapy | ||
|
||
# Sphinx documentation | ||
docs/_build/ | ||
|
||
# PyBuilder | ||
target/ | ||
|
||
# Jupyter Notebook | ||
.ipynb_checkpoints | ||
|
||
# IPython | ||
profile_default/ | ||
ipython_config.py | ||
|
||
# pyenv | ||
.python-version | ||
|
||
# pipenv | ||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. | ||
# However, in case of collaboration, if having platform-specific dependencies or dependencies | ||
# having no cross-platform support, pipenv may install dependencies that don't work, or not | ||
# install all needed dependencies. | ||
#Pipfile.lock | ||
|
||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow | ||
__pypackages__/ | ||
|
||
# Celery stuff | ||
celerybeat-schedule | ||
celerybeat.pid | ||
|
||
# SageMath parsed files | ||
*.sage.py | ||
|
||
# Environments | ||
.env | ||
.venv | ||
env/ | ||
venv/ | ||
ENV/ | ||
env.bak/ | ||
venv.bak/ | ||
|
||
# Spyder project settings | ||
.spyderproject | ||
.spyproject | ||
|
||
# Rope project settings | ||
.ropeproject | ||
|
||
# mkdocs documentation | ||
/site | ||
|
||
# mypy | ||
.mypy_cache/ | ||
.dmypy.json | ||
dmypy.json | ||
|
||
# Pyre type checker | ||
.pyre/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# Creative Commons Attribution 4.0 International License | ||
|
||
Copyright (c) 2023 Michael J Rossetti | ||
|
||
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>. | ||
|
||
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a> | ||
|
||
## You are free to: | ||
|
||
+ Share — copy and redistribute the material in any medium or format | ||
|
||
+ Adapt — remix, transform, and build upon the material for any purpose, even commercially. | ||
|
||
The licensor cannot revoke these freedoms as long as you follow the license terms. | ||
|
||
|
||
## Under the following terms: | ||
|
||
+ Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. | ||
|
||
+ No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. | ||
|
||
## Notices: | ||
|
||
+ You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. | ||
|
||
+ No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
web: gunicorn "web_app:create_app()" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
# flask-sheets-template-2023 | ||
|
||
A web application starter template, created in Python with the Flask framework. Allows users to login with their Google accounts (via OAuth). Interfaces with a Google Sheets database. | ||
|
||
![](https://user-images.githubusercontent.com/1328807/160312385-7ffbbada-4363-4b48-873d-9eca868afef0.png) | ||
|
||
## Prerequisites | ||
|
||
This application requires a Python development environment: | ||
|
||
+ Git | ||
+ Anaconda, Python, Pip | ||
|
||
For beginners, here are some instructions for how to install Anaconda, and [set up your local Python development environment](https://github.com/prof-rossetti/intro-to-python/blob/main/exercises/local-dev-setup/README.md#anaconda-python-and-pip). | ||
|
||
## Repo Setup | ||
|
||
Make a copy of this template repo (as necessary). Clone your copy of the repo onto your local machine. Navigate there from the command-line. | ||
|
||
Setup and activate a new Anaconda virtual environment: | ||
|
||
```sh | ||
conda create -n flask-sheets-env-2023 python=3.10 | ||
conda activate flask-sheets-env-2023 | ||
``` | ||
|
||
Install package dependencies: | ||
|
||
```sh | ||
pip install -r requirements.txt | ||
``` | ||
|
||
## Services Setup | ||
|
||
This app requires a few services, for user authentication and data storage. Follow the instructions below to setup these services. | ||
|
||
### Google Cloud Project | ||
|
||
Visit the [Google Cloud Console](https://console.cloud.google.com). Create a new project, and name it. After it is created, select it from the project selection dropdown menu. | ||
|
||
### Google OAuth Client | ||
|
||
Visit the [API Credentials](https://console.cloud.google.com/apis/credentials) page for your Google Cloud project. Click the button with the plus icon to "Create Credentials", and choose "Create OAuth Client Id". | ||
|
||
Click to "Configure Consent Screen". Leave the domain info blank, and leave the defaults / skip lots of the setup for now. If/when you deploy your app to a production server, you can return to populating this info (or you will be using a different project). | ||
|
||
Return to actually creating the "OAuth Client Id". Choose a "Web application" type, give it a name, and set the following "Authorized Redirect URIs" (for now, while the project is still in development): | ||
|
||
+ http://localhost:5000/auth/google/callback | ||
|
||
After the client is created, note the `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`, and set them as environment variables (see configuration section below). | ||
|
||
### Google Cloud Service Account Credentials | ||
|
||
To fetch data from the Google Sheets database (and use other Google APIs), the app will need access to a local "service account" credentials file. | ||
|
||
From the [Google API Credentials](https://console.cloud.google.com/apis/credentials) page, create a new service account as necessary. | ||
|
||
For the chosen service account, create new JSON credentials file as necessary from the "Keys" menu, then download the resulting JSON file into the root directory of this repo, specifically named "google-credentials.json". | ||
|
||
|
||
### Google Sheets Database Setup | ||
|
||
See the [Google Sheets Database Setup](/admin/SHEETS_DB.md) guide. | ||
|
||
### Google Analytics Setup | ||
|
||
If you would like to configure Google Analytics, consult the [Google Analytics Setup](/admin/GA.md) guide. | ||
|
||
|
||
|
||
## Configuration | ||
|
||
### Environment Variables | ||
|
||
Create a file called ".env" in the root directory of this repository, and populate it with environment variables to specify your own credentials, as obtained in the "Setup" section above: | ||
|
||
```sh | ||
FLASK_APP="web_app" | ||
|
||
# | ||
# GOOGLE OAUTH | ||
# | ||
GOOGLE_CLIENT_ID="____________" | ||
GOOGLE_CLIENT_SECRET="____________" | ||
|
||
# | ||
# GOOGLE SHEETS DATABASE | ||
# | ||
GOOGLE_SHEETS_DOCUMENT_ID="____________" | ||
|
||
# | ||
# GOOGLE ANALYTICS | ||
# | ||
GA_TRACKER_ID="UA-XXXXXXX-1" | ||
``` | ||
|
||
|
||
|
||
|
||
## Usage | ||
|
||
### Sheets Service | ||
|
||
After configuring the Google Sheet database and populating it with products, you should be able to test out the app's ability to fetch products (and generate new orders): | ||
|
||
```sh | ||
python -m app.sheets_service | ||
``` | ||
|
||
### Web Application | ||
|
||
Run the local web server (then visit localhost:5000 in a browser): | ||
|
||
```sh | ||
FLASK_APP=web_app flask run | ||
``` | ||
|
||
## Testing | ||
|
||
Run tests: | ||
|
||
```sh | ||
pytest | ||
``` | ||
|
||
> NOTE: we are using a live sheet for testing, so to avoid API rate limits, we are waiting / sleeping between each test, which makes the tests a bit slow for now | ||
|
||
## CI | ||
|
||
See more information about the [CI](/admin/CI.md) build process. | ||
|
||
## Deploying | ||
|
||
See the [Deployer's Guide](/admin/RENDER.md) for instructions on deploying to a production server hosted by Render. | ||
|
||
|
||
|
||
## [License](/LICENSE.md) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
|
||
# CI | ||
|
||
For configuring Continuous Integration for this Python Application using GitHub Actions. | ||
|
||
The "python-app.yml" [configuration file](/.github/workflows/python-app.yml) specifies what steps should take place during the CI build. | ||
|
||
|
||
|
||
In GitHub repository settings, find the secrets and variables menu for "actions", and add a "New repository secret" called `GOOGLE_API_CREDENTIALS`, and paste the JSON content from the "google-credentials.json" file. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
### Google Analytics | ||
|
||
Visit [Google Analytics](https://analytics.google.com/) and create a web property as necessary. From Google Analytics, visit the web property's admin settings, find the "Measurement ID" (e.g. "G-XXXXXXXXXX"), and use this value for the `GA_TRACKER_ID` environment variable (see "Configuration" section in the README). |
Oops, something went wrong.