Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
611f9b5
add .envrc
chrisdietr Aug 23, 2020
16f03b0
vid 1 done
chrisdietr Aug 23, 2020
5e5dce6
vid 2 done
chrisdietr Aug 23, 2020
d790383
added stylesheets now + about template. next adding block
chrisdietr Aug 23, 2020
c9d83b8
added block main_content to _layout.html
chrisdietr Aug 23, 2020
092d0e5
added block main_content to _layout.html
chrisdietr Aug 23, 2020
46acf67
and we are live :)
chrisdietr Aug 23, 2020
fcb9704
using block to organize templates
chrisdietr Aug 23, 2020
028f211
move templates into folders
chrisdietr Aug 23, 2020
22f8486
added view modifiers - Michaels Hack.
chrisdietr Aug 24, 2020
42f3c36
chapter06: create package_service.py
chrisdietr Aug 24, 2020
36f562f
chapter06: using flask blueprint to register views
chrisdietr Aug 24, 2020
be53764
chapter06: using flask blueprint to register views
chrisdietr Aug 24, 2020
062101a
chapter06: using flask blueprint to register views. now also for pack…
chrisdietr Aug 24, 2020
689823b
chapter06: added packages/details.html
chrisdietr Aug 24, 2020
44827dd
chapter06: added new blueprint for popular route, with integer
chrisdietr Aug 24, 2020
a850267
chapter06: create new view for account_views.py for account registrat…
chrisdietr Aug 24, 2020
b9e6d39
chapter06: create new view for account_views.py for account registrat…
chrisdietr Aug 24, 2020
fb2a610
chapter06: adding cms in 8 minutes
chrisdietr Aug 24, 2020
438ff29
chapter06: adding cms in 8 minutes
chrisdietr Aug 24, 2020
0b42c4b
chapter06: adding cms in 8 minutes: register cms_views.py blueprint, …
chrisdietr Aug 24, 2020
58a7c18
chapter06: adding cms in 8 minutes: register cms_views.py blueprint, …
chrisdietr Aug 24, 2020
43953fd
chapter09: sqlalchemy starting
chrisdietr Aug 27, 2020
064720e
chapter09: building Package table structure
chrisdietr Aug 27, 2020
1bb7af3
chapter09: building Package table structure
chrisdietr Aug 27, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .envrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
layout pyenv 3.8.4
30 changes: 30 additions & 0 deletions app/ch05_jinja_templates/starter/pypi_org/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import flask

from pypi_org.infrastructure.view_modifiers import response
app = flask.Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0


def get_latest_packages():
return [
{'name': 'flask', 'version': '1.2.3'},
{'name': 'sqlachemy', 'version': '2.2.0'},
{'name': 'passlib', 'version': '3.0.0'},
]

@app.route('/')
@response(template_file='home/index.html')
def index():
test_packages = get_latest_packages()
return {'packages': test_packages}

@app.route("/about")
@response(template_file='home/about.html')
def about():
return {}
# return flask.render_template('home/about.html')
# ^^ replaced with the view modifiers and @response


if __name__ == '__main__':
app.run(debug=True)
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from functools import wraps

import flask
import werkzeug
import werkzeug.wrappers


def response(*, mimetype: str = None, template_file: str = None):
def response_inner(f):
# print("Wrapping in response {}".format(f.__name__), flush=True)

@wraps(f)
def view_method(*args, **kwargs):
response_val = f(*args, **kwargs)

if isinstance(response_val, werkzeug.wrappers.Response):
return response_val

if isinstance(response_val, flask.Response):
return response_val

if isinstance(response_val, dict):
model = dict(response_val)
else:
model = dict()

if template_file and not isinstance(response_val, dict):
raise Exception(
"Invalid return type {}, we expected a dict as the return value.".format(type(response_val)))

if template_file:
response_val = flask.render_template(template_file, **response_val)

resp = flask.make_response(response_val)
resp.model = model
if mimetype:
resp.mimetype = mimetype

return resp

return view_method

return response_inner


#
# def template(template_file: str = None):
# def template_inner(f):
# @wraps(f)
# def view_method(*args, **kwargs):
# data_dict = f(*args, **kwargs)
# if not isinstance(data_dict, dict):
# raise Exception(
# "Invalid return type {}, we expected a dict as the return value.".format(type(data_dict)))
#
# return flask.render_template(template_file, **data_dict)
#
# return view_method
#
# return template_inner
18 changes: 18 additions & 0 deletions app/ch05_jinja_templates/starter/pypi_org/static/css/site.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.title {
font-weight: bold;
}

.main_content {
padding: 20px;
}

nav {
background-color: #000;
padding: 10px;
font-size: 20px;
color: white;
}

nav > a {
color: white;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "shared/_layout.html" %}

{% block title %}About{% endblock %}

{% block main_content %}
<h1>About Python Package Index</h1>

<h2>About</h2>

<div>
This is our demo app for our Flask course.
</div>
{% endblock %}

{% block additional_css %}<!-- some about stuff -->{% endblock %}

{% block additional_js %}{% endblock %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{% extends "shared/_layout.html" %}

{% block title %}Homepage
{% endblock %}


{% block main_content %}
<div class="main_content">
<h1>Python Package index</h1>

<h2>Packages</h2>
TODO: Show packages<br>

{% for p in packages %}
<div>
<span class="title">
{{ p.name }}
</span>
<span class="version">
{{ p.version }}
</span>
</div>
{% endfor %}
</div>
{% endblock %}

{% block additional_css %}<!-- some about stuff -->
{% endblock %}

{% block additional_js %}
{% endblock %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %} - Pypi.org</title>

<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css" integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/js/bootstrap.min.js" integrity="sha384-oesi62hOLfzrys4LxRF63OJCXdXDipiYWBnvTl9Y9/TRlw5xlKIEHpNyvvDShgf/" crossorigin="anonymous"></script>

<link rel="stylesheet" href="/static/css/site.css">
{% block additional_css %}{% endblock %}
{% block additional_js %}{% endblock %}
</head>
<body>

<nav>
<a href="/">Home</a>
<a href="/about">About</a>
</nav>

<div class="main_content">
{% block main_content %}{% endblock %}
</div>

</body>
</html>
1 change: 1 addition & 0 deletions app/ch05_jinja_templates/starter/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
flask
35 changes: 11 additions & 24 deletions app/ch06_routing/starter/pypi_org/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,20 @@
folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.insert(0, folder)


from pypi_org.infrastructure.view_modifiers import response

app = flask.Flask(__name__)

def main():
register_blueprints()
app.run(debug=True)

def get_latest_packages():
return [
{'name': 'flask', 'version': '1.2.3'},
{'name': 'sqlalchemy', 'version': '2.2.0'},
{'name': 'passlib', 'version': '3.0.0'},
]


@app.route('/')
@response(template_file='home/index.html')
def index():
test_packages = get_latest_packages()
return {'packages': test_packages}
# return flask.render_template('home/index.html', packages=test_packages)


@app.route('/about')
@response(template_file='home/about.html')
def about():
return {}
def register_blueprints():
from pypi_org.views import home_views
from pypi_org.views import package_views
from pypi_org.views import cms_views
app.register_blueprint(home_views.blueprint)
app.register_blueprint(package_views.blueprint)
app.register_blueprint(cms_views.blueprint)


if __name__ == '__main__':
app.run(debug=True)
main()
21 changes: 21 additions & 0 deletions app/ch06_routing/starter/pypi_org/services/cms_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
fake_db = {
'/company/history': {
'page_title': 'Company history',
'page_details': 'Details about company history...',
},
'/company/employees': {
'page_title': 'Out team',
'page_details': 'Details about company employees...',
},
}

def get_page(url: str) -> dict:
if not url:
return {}

url = url.strip().lower()
url = '/' + url.lstrip('/')

page = fake_db.get(url, {})
return page

6 changes: 6 additions & 0 deletions app/ch06_routing/starter/pypi_org/services/package_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
def get_latest_packages():
return [
{'name': 'flask', 'version': '1.2.3'},
{'name': 'sqlalchemy', 'version': '2.2.0'},
{'name': 'passlib', 'version': '3.0.0'},
]
10 changes: 10 additions & 0 deletions app/ch06_routing/starter/pypi_org/templates/cms/page.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{% extends "shared/_layout.html" %}
{% block title %}{{ page_title }}{% endblock %}

{% block main_content %}
<h1>{{ page_title}}</h1>

<div>
{{ page_details }}
</div>
{% endblock %}
20 changes: 20 additions & 0 deletions app/ch06_routing/starter/pypi_org/templates/packages/details.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{% extends "shared/_layout.html" %}
{% block main_content %}

<h1>Python Package Index</h1>

<h2>Packages</h2>

{% for p in packages %}

<div>
<span class="title">
{{ p.name.upper() }}
</span>
<span class="version">
{{ p.version }}
</span>
</div>

{% endfor %}
{% endblock %}
39 changes: 39 additions & 0 deletions app/ch06_routing/starter/pypi_org/views/account_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import flask

from pypi_org.infrastructure.view_modifiers import response

blueprint = flask.Blueprint('account', __name__, template_folder='templates')

# ######## Index ########

@blueprint.route('/account')
@response(template_file='home/index.html')
def index():
return {}


# ######## Register ########

@blueprint.route('/account/register', methods=['GET'])
@response(template_file='account/register.html')
def register_get():
return {}

@blueprint.route('/account/register', methods=['POST'])
@response(template_file='account/register.html')
def register_get():
return {}

# ######## Login ########

@blueprint.route('/account/login', method=['GET'])
@response(template_file='account/login.html')
def login_get():
return {}


# ######## Logout ########

@blueprint.route('/account/logout')
def logout():
return {}
17 changes: 17 additions & 0 deletions app/ch06_routing/starter/pypi_org/views/cms_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import flask

from pypi_org.infrastructure.view_modifiers import response
import pypi_org.services.cms_service as cms_service

blueprint = flask.Blueprint('cms', __name__, template_folder='templates')

@blueprint.route('/<path:full_url>')
@response(template_file='cms/page.html')
def cms_page(full_url: str):
print("Getting CMS page for {}".format(full_url))
page = cms_service.get_page(full_url)
if not page:
flask.abort(404)

return page

20 changes: 20 additions & 0 deletions app/ch06_routing/starter/pypi_org/views/home_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import flask

from pypi_org.infrastructure.view_modifiers import response
import pypi_org.services.package_service as package_service
from

blueprint = flask.Blueprint('home', __name__, template_folder='templates')

@blueprint.route('/')
@response(template_file='home/index.html')
def index():
test_packages = package_service.get_latest_packages()
return {'packages': test_packages}
# return flask.render_template('home/index.html', packages=test_packages)


@blueprint.route('/about')
@response(template_file='home/about.html')
def about():
return {}
Loading