From 611f9b57f1f2f4fde9c2ef78cfccf07235b5b41f Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 20:57:17 +0300 Subject: [PATCH 01/25] add .envrc --- .envrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..40480b40 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +layout pyenv 3.8.4 From 16f03b01417caa13c8152f5f60a6a7aa50ec189b Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 21:08:06 +0300 Subject: [PATCH 02/25] vid 1 done --- app/ch05_jinja_templates/starter/pypi_org/app.py | 11 +++++++++++ .../starter/{placeholder.txt => requirements-dev.txt} | 0 app/ch05_jinja_templates/starter/requirements.txt | 1 + 3 files changed, 12 insertions(+) create mode 100644 app/ch05_jinja_templates/starter/pypi_org/app.py rename app/ch05_jinja_templates/starter/{placeholder.txt => requirements-dev.txt} (100%) create mode 100644 app/ch05_jinja_templates/starter/requirements.txt diff --git a/app/ch05_jinja_templates/starter/pypi_org/app.py b/app/ch05_jinja_templates/starter/pypi_org/app.py new file mode 100644 index 00000000..fbe7ec53 --- /dev/null +++ b/app/ch05_jinja_templates/starter/pypi_org/app.py @@ -0,0 +1,11 @@ +import flask + +app = flask.Flask(__name__) + +@app.route("/") +def index(): + return "Hello World!" + + +if __name__ == '__main__': + app.run() \ No newline at end of file diff --git a/app/ch05_jinja_templates/starter/placeholder.txt b/app/ch05_jinja_templates/starter/requirements-dev.txt similarity index 100% rename from app/ch05_jinja_templates/starter/placeholder.txt rename to app/ch05_jinja_templates/starter/requirements-dev.txt diff --git a/app/ch05_jinja_templates/starter/requirements.txt b/app/ch05_jinja_templates/starter/requirements.txt new file mode 100644 index 00000000..7e106024 --- /dev/null +++ b/app/ch05_jinja_templates/starter/requirements.txt @@ -0,0 +1 @@ +flask From 5e5dce66606106dd8d2ccdedb2aa012ad1ed9e55 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 21:31:12 +0300 Subject: [PATCH 03/25] vid 2 done --- .../starter/pypi_org/app.py | 14 ++++++++-- .../starter/pypi_org/templates/index.html | 26 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 app/ch05_jinja_templates/starter/pypi_org/templates/index.html diff --git a/app/ch05_jinja_templates/starter/pypi_org/app.py b/app/ch05_jinja_templates/starter/pypi_org/app.py index fbe7ec53..d48c712f 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/app.py +++ b/app/ch05_jinja_templates/starter/pypi_org/app.py @@ -2,10 +2,20 @@ app = flask.Flask(__name__) +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("/") def index(): - return "Hello World!" + test_packages = get_latest_packages() + return flask.render_template('index.html', packages=test_packages) + + if __name__ == '__main__': - app.run() \ No newline at end of file + app.run(debug=True) \ No newline at end of file diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html b/app/ch05_jinja_templates/starter/pypi_org/templates/index.html new file mode 100644 index 00000000..92bded1c --- /dev/null +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/index.html @@ -0,0 +1,26 @@ + + + + + Python Package Index (demo) + + + +

Python Package index

+ +

Packages

+TODO: Show packages
+ +{% for p in packages %} +
+ + {{ p.name }} + + + {{ p.version }} + +
+{% endfor %} + + + \ No newline at end of file From d790383a7b5e24602dfea50e01d2d003877d403d Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 22:54:40 +0300 Subject: [PATCH 04/25] added stylesheets now + about template. next adding block --- .../starter/pypi_org/app.py | 5 +++ .../starter/pypi_org/static/css/site.css | 18 +++++++++ .../starter/pypi_org/templates/_layout.html | 26 +++++++++++++ .../starter/pypi_org/templates/about.html | 18 +++++++++ .../starter/pypi_org/templates/index.html | 38 +++++++++++++------ 5 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 app/ch05_jinja_templates/starter/pypi_org/static/css/site.css create mode 100644 app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html create mode 100644 app/ch05_jinja_templates/starter/pypi_org/templates/about.html diff --git a/app/ch05_jinja_templates/starter/pypi_org/app.py b/app/ch05_jinja_templates/starter/pypi_org/app.py index d48c712f..066db975 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/app.py +++ b/app/ch05_jinja_templates/starter/pypi_org/app.py @@ -1,6 +1,8 @@ import flask app = flask.Flask(__name__) +app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 + def get_latest_packages(): return [ @@ -14,6 +16,9 @@ def index(): test_packages = get_latest_packages() return flask.render_template('index.html', packages=test_packages) +@app.route("/about") +def about(): + return flask.render_template('about.html') diff --git a/app/ch05_jinja_templates/starter/pypi_org/static/css/site.css b/app/ch05_jinja_templates/starter/pypi_org/static/css/site.css new file mode 100644 index 00000000..b3728c3c --- /dev/null +++ b/app/ch05_jinja_templates/starter/pypi_org/static/css/site.css @@ -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; +} \ No newline at end of file diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html new file mode 100644 index 00000000..3536ece9 --- /dev/null +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html @@ -0,0 +1,26 @@ + + + + + Python Package Index (demo) + + + + + + + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html b/app/ch05_jinja_templates/starter/pypi_org/templates/about.html new file mode 100644 index 00000000..01498526 --- /dev/null +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/about.html @@ -0,0 +1,18 @@ + + + + + Python Package Index (demo) + + + +

Python Package index

+ +

About

+ +
+ This is our demo app for our Flask course. +
+ + + \ No newline at end of file diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html b/app/ch05_jinja_templates/starter/pypi_org/templates/index.html index 92bded1c..a5fd8e3f 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/index.html @@ -3,24 +3,38 @@ Python Package Index (demo) + + + + + + + -

Python Package index

+ + +
+

Python Package index

-

Packages

-TODO: Show packages
+

Packages

+ TODO: Show packages
-{% for p in packages %} -
- - {{ p.name }} - - - {{ p.version }} - + {% for p in packages %} +
+ + {{ p.name }} + + + {{ p.version }} + +
+ {% endfor %}
-{% endfor %} \ No newline at end of file From c9d83b858b7a2ab471b971cdc9f25bb6eda3748e Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 22:55:10 +0300 Subject: [PATCH 05/25] added block main_content to _layout.html --- .../starter/pypi_org/templates/_layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html index 3536ece9..d4dcf791 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html @@ -19,7 +19,7 @@
- + {% block main_content %}
From 092d0e54ac76f2fe0d061258393279e815e3fba3 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 22:55:27 +0300 Subject: [PATCH 06/25] added block main_content to _layout.html --- .../starter/pypi_org/templates/_layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html index d4dcf791..342a23af 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html @@ -19,7 +19,7 @@
- {% block main_content %} + {% block main_content %}{% endblock %}
From 46acf67bb6fc92d689ecaba6555f939a32d38348 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 22:57:33 +0300 Subject: [PATCH 07/25] and we are live :) --- .../starter/pypi_org/templates/about.html | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html b/app/ch05_jinja_templates/starter/pypi_org/templates/about.html index 01498526..004286ea 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/about.html @@ -1,12 +1,7 @@ - - - - - Python Package Index (demo) - - +{% extends "_layout.html" %} +{% block main_content %} -

Python Package index

+

About Python Package index

About

@@ -14,5 +9,4 @@

About

This is our demo app for our Flask course.
- - \ No newline at end of file +{% endblock %} \ No newline at end of file From fcb97041b3c711ebb04b9ad8f018ae6b30f635d5 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 23:07:34 +0300 Subject: [PATCH 08/25] using block to organize templates --- .../starter/pypi_org/templates/_layout.html | 4 ++- .../starter/pypi_org/templates/about.html | 11 +++++-- .../starter/pypi_org/templates/index.html | 29 +++++++------------ 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html index 342a23af..f6a606a5 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html @@ -2,7 +2,7 @@ - Python Package Index (demo) + {% block title %}{% endblock %} - Pypi.org @@ -10,6 +10,8 @@ + {% block additional_css %}{% endblock %} + {% block additional_js %}{% endblock %} diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html b/app/ch05_jinja_templates/starter/pypi_org/templates/about.html index 004286ea..dd957719 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/about.html @@ -1,12 +1,17 @@ {% extends "_layout.html" %} -{% block main_content %} -

About Python Package index

+{% block title %}About{% endblock %} + +{% block main_content %} +

About Python Package Index

About

This is our demo app for our Flask course.
+{% endblock %} + +{% block additional_css %}{% endblock %} -{% endblock %} \ No newline at end of file +{% block additional_js %}{% endblock %} \ No newline at end of file diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html b/app/ch05_jinja_templates/starter/pypi_org/templates/index.html index a5fd8e3f..4326bc89 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/index.html @@ -1,23 +1,10 @@ - - - - - Python Package Index (demo) +{% extends "_layout.html" %} - +{% block title %}Homepage +{% endblock %} - - - - - - - - +{% block main_content %}

Python Package index

@@ -35,6 +22,10 @@

Packages

{% endfor %} +{% endblock %} + +{% block additional_css %} +{% endblock %} - - \ No newline at end of file +{% block additional_js %} +{% endblock %} \ No newline at end of file From 028f211087a8fb53bbdbda91a4504996994020d9 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Sun, 23 Aug 2020 23:10:00 +0300 Subject: [PATCH 09/25] move templates into folders --- app/ch05_jinja_templates/starter/pypi_org/app.py | 4 ++-- .../starter/pypi_org/templates/{ => home}/about.html | 2 +- .../starter/pypi_org/templates/{ => home}/index.html | 2 +- .../starter/pypi_org/templates/{ => shared}/_layout.html | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename app/ch05_jinja_templates/starter/pypi_org/templates/{ => home}/about.html (89%) rename app/ch05_jinja_templates/starter/pypi_org/templates/{ => home}/index.html (93%) rename app/ch05_jinja_templates/starter/pypi_org/templates/{ => shared}/_layout.html (100%) diff --git a/app/ch05_jinja_templates/starter/pypi_org/app.py b/app/ch05_jinja_templates/starter/pypi_org/app.py index 066db975..d633fda0 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/app.py +++ b/app/ch05_jinja_templates/starter/pypi_org/app.py @@ -14,11 +14,11 @@ def get_latest_packages(): @app.route("/") def index(): test_packages = get_latest_packages() - return flask.render_template('index.html', packages=test_packages) + return flask.render_template('home/index.html', packages=test_packages) @app.route("/about") def about(): - return flask.render_template('about.html') + return flask.render_template('home/about.html') diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html b/app/ch05_jinja_templates/starter/pypi_org/templates/home/about.html similarity index 89% rename from app/ch05_jinja_templates/starter/pypi_org/templates/about.html rename to app/ch05_jinja_templates/starter/pypi_org/templates/home/about.html index dd957719..41fcbfc5 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/about.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/home/about.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "shared/_layout.html" %} {% block title %}About{% endblock %} diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html b/app/ch05_jinja_templates/starter/pypi_org/templates/home/index.html similarity index 93% rename from app/ch05_jinja_templates/starter/pypi_org/templates/index.html rename to app/ch05_jinja_templates/starter/pypi_org/templates/home/index.html index 4326bc89..46da5071 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/templates/index.html +++ b/app/ch05_jinja_templates/starter/pypi_org/templates/home/index.html @@ -1,4 +1,4 @@ -{% extends "_layout.html" %} +{% extends "shared/_layout.html" %} {% block title %}Homepage {% endblock %} diff --git a/app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html b/app/ch05_jinja_templates/starter/pypi_org/templates/shared/_layout.html similarity index 100% rename from app/ch05_jinja_templates/starter/pypi_org/templates/_layout.html rename to app/ch05_jinja_templates/starter/pypi_org/templates/shared/_layout.html From 22f8486616f104a7847219dc685a76922df73a14 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:02:42 +0300 Subject: [PATCH 10/25] added view modifiers - Michaels Hack. --- .../starter/pypi_org/app.py | 12 ++-- .../pypi_org/infrastructure/view_modifiers.py | 60 +++++++++++++++++++ 2 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 app/ch05_jinja_templates/starter/pypi_org/infrastructure/view_modifiers.py diff --git a/app/ch05_jinja_templates/starter/pypi_org/app.py b/app/ch05_jinja_templates/starter/pypi_org/app.py index d633fda0..751cb4d3 100644 --- a/app/ch05_jinja_templates/starter/pypi_org/app.py +++ b/app/ch05_jinja_templates/starter/pypi_org/app.py @@ -1,5 +1,6 @@ import flask +from pypi_org.infrastructure.view_modifiers import response app = flask.Flask(__name__) app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 @@ -11,15 +12,18 @@ def get_latest_packages(): {'name': 'passlib', 'version': '3.0.0'}, ] -@app.route("/") +@app.route('/') +@response(template_file='home/index.html') def index(): test_packages = get_latest_packages() - return flask.render_template('home/index.html', packages=test_packages) + return {'packages': test_packages} @app.route("/about") +@response(template_file='home/about.html') def about(): - return flask.render_template('home/about.html') - + return {} + # return flask.render_template('home/about.html') + # ^^ replaced with the view modifiers and @response if __name__ == '__main__': diff --git a/app/ch05_jinja_templates/starter/pypi_org/infrastructure/view_modifiers.py b/app/ch05_jinja_templates/starter/pypi_org/infrastructure/view_modifiers.py new file mode 100644 index 00000000..0c0941eb --- /dev/null +++ b/app/ch05_jinja_templates/starter/pypi_org/infrastructure/view_modifiers.py @@ -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 From 42f3c36777cc849f8b1378141e02795faab1e3d9 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:06:29 +0300 Subject: [PATCH 11/25] chapter06: create package_service.py --- app/ch06_routing/starter/pypi_org/app.py | 11 ++--------- .../starter/pypi_org/services/package_service.py | 6 ++++++ 2 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 app/ch06_routing/starter/pypi_org/services/package_service.py diff --git a/app/ch06_routing/starter/pypi_org/app.py b/app/ch06_routing/starter/pypi_org/app.py index fe54fabf..481d97ef 100644 --- a/app/ch06_routing/starter/pypi_org/app.py +++ b/app/ch06_routing/starter/pypi_org/app.py @@ -4,24 +4,17 @@ folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) sys.path.insert(0, folder) - from pypi_org.infrastructure.view_modifiers import response +import pypi_org.services.package_service as package_service app = flask.Flask(__name__) -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() + test_packages = package_service.get_latest_packages() return {'packages': test_packages} # return flask.render_template('home/index.html', packages=test_packages) diff --git a/app/ch06_routing/starter/pypi_org/services/package_service.py b/app/ch06_routing/starter/pypi_org/services/package_service.py new file mode 100644 index 00000000..a77aa2f1 --- /dev/null +++ b/app/ch06_routing/starter/pypi_org/services/package_service.py @@ -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'}, + ] From 36f562f17bf331b24ca39691e393373c2b7b531a Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:12:04 +0300 Subject: [PATCH 12/25] chapter06: using flask blueprint to register views --- app/ch06_routing/starter/pypi_org/app.py | 23 +++++-------------- .../starter/pypi_org/views/home_views.py | 19 +++++++++++++++ .../starter/pypi_org/views/package_views.py | 0 3 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 app/ch06_routing/starter/pypi_org/views/home_views.py create mode 100644 app/ch06_routing/starter/pypi_org/views/package_views.py diff --git a/app/ch06_routing/starter/pypi_org/app.py b/app/ch06_routing/starter/pypi_org/app.py index 481d97ef..ad8088db 100644 --- a/app/ch06_routing/starter/pypi_org/app.py +++ b/app/ch06_routing/starter/pypi_org/app.py @@ -4,26 +4,15 @@ folder = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) sys.path.insert(0, folder) -from pypi_org.infrastructure.view_modifiers import response -import pypi_org.services.package_service as package_service - app = flask.Flask(__name__) +def main(): + register_blueprints() + app.run(debug=True) - -@app.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) - - -@app.route('/about') -@response(template_file='home/about.html') -def about(): - return {} +def register_blueprints(): + from pypi_org.views import home_views if __name__ == '__main__': - app.run(debug=True) + main() \ No newline at end of file diff --git a/app/ch06_routing/starter/pypi_org/views/home_views.py b/app/ch06_routing/starter/pypi_org/views/home_views.py new file mode 100644 index 00000000..de8d45c9 --- /dev/null +++ b/app/ch06_routing/starter/pypi_org/views/home_views.py @@ -0,0 +1,19 @@ +import flask + +from pypi_org.infrastructure.view_modifiers import response +import pypi_org.services.package_service as package_service + +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 {} diff --git a/app/ch06_routing/starter/pypi_org/views/package_views.py b/app/ch06_routing/starter/pypi_org/views/package_views.py new file mode 100644 index 00000000..e69de29b From be53764f4a3d1ba882a29a417f5c0418e5f3996e Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:13:06 +0300 Subject: [PATCH 13/25] chapter06: using flask blueprint to register views --- app/ch06_routing/starter/pypi_org/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/ch06_routing/starter/pypi_org/app.py b/app/ch06_routing/starter/pypi_org/app.py index ad8088db..42cab0d6 100644 --- a/app/ch06_routing/starter/pypi_org/app.py +++ b/app/ch06_routing/starter/pypi_org/app.py @@ -12,6 +12,7 @@ def main(): def register_blueprints(): from pypi_org.views import home_views + app.register_blueprint(home_views.blueprint) if __name__ == '__main__': From 062101aeda7c49b3e25100582156a399d4a100aa Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:17:50 +0300 Subject: [PATCH 14/25] chapter06: using flask blueprint to register views. now also for packages. --- app/ch06_routing/starter/pypi_org/app.py | 4 +++- .../starter/pypi_org/views/package_views.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/ch06_routing/starter/pypi_org/app.py b/app/ch06_routing/starter/pypi_org/app.py index 42cab0d6..58c2cf16 100644 --- a/app/ch06_routing/starter/pypi_org/app.py +++ b/app/ch06_routing/starter/pypi_org/app.py @@ -12,8 +12,10 @@ def main(): def register_blueprints(): from pypi_org.views import home_views + from pypi_org.views import package_views app.register_blueprint(home_views.blueprint) + app.register_blueprint(package_views.blueprint) if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/app/ch06_routing/starter/pypi_org/views/package_views.py b/app/ch06_routing/starter/pypi_org/views/package_views.py index e69de29b..c24dd4ca 100644 --- a/app/ch06_routing/starter/pypi_org/views/package_views.py +++ b/app/ch06_routing/starter/pypi_org/views/package_views.py @@ -0,0 +1,13 @@ +import flask + +from pypi_org.infrastructure.view_modifiers import response +import pypi_org.services.package_service as package_service + +blueprint = flask.Blueprint('packages', __name__, template_folder='templates') + +@blueprint.route('/project/') +# @response(template_file='packages/details.html') +def package_details(package_name: str): + test_packages = package_service.get_latest_packages() + return "Package details for {}".format(package_name) + # return flask.render_template('home/index.html', packages=test_packages) \ No newline at end of file From 689823b3c032c28e6e3a1adbdde700c3218e46e2 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:23:47 +0300 Subject: [PATCH 15/25] chapter06: added packages/details.html --- .../pypi_org/templates/packages/details.html | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/ch06_routing/starter/pypi_org/templates/packages/details.html diff --git a/app/ch06_routing/starter/pypi_org/templates/packages/details.html b/app/ch06_routing/starter/pypi_org/templates/packages/details.html new file mode 100644 index 00000000..6096101a --- /dev/null +++ b/app/ch06_routing/starter/pypi_org/templates/packages/details.html @@ -0,0 +1,20 @@ +{% extends "shared/_layout.html" %} +{% block main_content %} + +

Python Package Index

+ +

Packages

+ + {% for p in packages %} + +
+ + {{ p.name.upper() }} + + + {{ p.version }} + +
+ + {% endfor %} +{% endblock %} \ No newline at end of file From 44827dd06398308c99cfb475f553efaf954c63f6 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:37:05 +0300 Subject: [PATCH 16/25] chapter06: added new blueprint for popular route, with integer --- app/ch06_routing/starter/pypi_org/views/package_views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/ch06_routing/starter/pypi_org/views/package_views.py b/app/ch06_routing/starter/pypi_org/views/package_views.py index c24dd4ca..ffbae951 100644 --- a/app/ch06_routing/starter/pypi_org/views/package_views.py +++ b/app/ch06_routing/starter/pypi_org/views/package_views.py @@ -6,8 +6,11 @@ blueprint = flask.Blueprint('packages', __name__, template_folder='templates') @blueprint.route('/project/') -# @response(template_file='packages/details.html') def package_details(package_name: str): test_packages = package_service.get_latest_packages() return "Package details for {}".format(package_name) - # return flask.render_template('home/index.html', packages=test_packages) \ No newline at end of file + +@blueprint.route('/') +def popular(rank: int): + print(type(rank), rank) + return "The details for the {}th most popular package".format(rank) \ No newline at end of file From a850267d71ff1d728bcdb5e3000ed87b0587d1fd Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:42:53 +0300 Subject: [PATCH 17/25] chapter06: create new view for account_views.py for account registration and login --- .../starter/pypi_org/views/account_views.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 app/ch06_routing/starter/pypi_org/views/account_views.py diff --git a/app/ch06_routing/starter/pypi_org/views/account_views.py b/app/ch06_routing/starter/pypi_org/views/account_views.py new file mode 100644 index 00000000..e8e72995 --- /dev/null +++ b/app/ch06_routing/starter/pypi_org/views/account_views.py @@ -0,0 +1,32 @@ +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 {} \ No newline at end of file From b9e6d39aa7fb7a6fd310f6c5a6f48caa2822c2cf Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:47:19 +0300 Subject: [PATCH 18/25] chapter06: create new view for account_views.py for account registration and login. adding logout --- app/ch06_routing/starter/pypi_org/views/account_views.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/ch06_routing/starter/pypi_org/views/account_views.py b/app/ch06_routing/starter/pypi_org/views/account_views.py index e8e72995..8e495e68 100644 --- a/app/ch06_routing/starter/pypi_org/views/account_views.py +++ b/app/ch06_routing/starter/pypi_org/views/account_views.py @@ -29,4 +29,11 @@ def register_get(): @blueprint.route('/account/login', method=['GET']) @response(template_file='account/login.html') def login_get(): - return {} \ No newline at end of file + return {} + + +# ######## Logout ######## + +@blueprint.route('/account/logout') +def logout(): + return {} From fb2a610931bf749a664d1f51fde8fc41d4648e18 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:55:28 +0300 Subject: [PATCH 19/25] chapter06: adding cms in 8 minutes --- .../starter/pypi_org/services/cms_service.py | 11 +++++++++++ app/ch06_routing/starter/pypi_org/views/cms_views.py | 0 2 files changed, 11 insertions(+) create mode 100644 app/ch06_routing/starter/pypi_org/services/cms_service.py create mode 100644 app/ch06_routing/starter/pypi_org/views/cms_views.py diff --git a/app/ch06_routing/starter/pypi_org/services/cms_service.py b/app/ch06_routing/starter/pypi_org/services/cms_service.py new file mode 100644 index 00000000..e63a5e90 --- /dev/null +++ b/app/ch06_routing/starter/pypi_org/services/cms_service.py @@ -0,0 +1,11 @@ +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...', + }, +} + diff --git a/app/ch06_routing/starter/pypi_org/views/cms_views.py b/app/ch06_routing/starter/pypi_org/views/cms_views.py new file mode 100644 index 00000000..e69de29b From 438ff29aa6f012feb4d81fd78141cb380ab368fd Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 14:57:49 +0300 Subject: [PATCH 20/25] chapter06: adding cms in 8 minutes --- .../starter/pypi_org/services/cms_service.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/ch06_routing/starter/pypi_org/services/cms_service.py b/app/ch06_routing/starter/pypi_org/services/cms_service.py index e63a5e90..23d67c38 100644 --- a/app/ch06_routing/starter/pypi_org/services/cms_service.py +++ b/app/ch06_routing/starter/pypi_org/services/cms_service.py @@ -9,3 +9,12 @@ }, } +def get_page(url: str) -> dict: + if not url: + return {} + + url = url.strip().lower() + + page = fake_db.get(url, {}) + return page + From 0b42c4b38fe7c201447bdad74cebdb5b41201b04 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 15:03:38 +0300 Subject: [PATCH 21/25] chapter06: adding cms in 8 minutes: register cms_views.py blueprint, add path routing --- app/ch06_routing/starter/pypi_org/app.py | 2 ++ .../starter/pypi_org/templates/cms/about.html | 10 ++++++++++ .../starter/pypi_org/views/cms_views.py | 17 +++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 app/ch06_routing/starter/pypi_org/templates/cms/about.html diff --git a/app/ch06_routing/starter/pypi_org/app.py b/app/ch06_routing/starter/pypi_org/app.py index 58c2cf16..c6c77268 100644 --- a/app/ch06_routing/starter/pypi_org/app.py +++ b/app/ch06_routing/starter/pypi_org/app.py @@ -13,8 +13,10 @@ def main(): 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__': diff --git a/app/ch06_routing/starter/pypi_org/templates/cms/about.html b/app/ch06_routing/starter/pypi_org/templates/cms/about.html new file mode 100644 index 00000000..54b551fd --- /dev/null +++ b/app/ch06_routing/starter/pypi_org/templates/cms/about.html @@ -0,0 +1,10 @@ +{% extends "shared/_layout.html" %} +{% block title %}{{ page_title }}{% endblock %} + +{% block main_content %} +

{{ page_title}}

+ +
+ {{ page_details }} +
+{% endblock %} diff --git a/app/ch06_routing/starter/pypi_org/views/cms_views.py b/app/ch06_routing/starter/pypi_org/views/cms_views.py index e69de29b..8180a24d 100644 --- a/app/ch06_routing/starter/pypi_org/views/cms_views.py +++ b/app/ch06_routing/starter/pypi_org/views/cms_views.py @@ -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(url) + if not page: + flask.abort(404) + + return page + From 58a7c18c7b8b2820619029101693deb5a5d4c496 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Mon, 24 Aug 2020 15:09:47 +0300 Subject: [PATCH 22/25] chapter06: adding cms in 8 minutes: register cms_views.py blueprint, add path routing. now works --- app/ch06_routing/starter/pypi_org/services/cms_service.py | 1 + .../starter/pypi_org/templates/cms/{about.html => page.html} | 0 app/ch06_routing/starter/pypi_org/views/cms_views.py | 4 ++-- 3 files changed, 3 insertions(+), 2 deletions(-) rename app/ch06_routing/starter/pypi_org/templates/cms/{about.html => page.html} (100%) diff --git a/app/ch06_routing/starter/pypi_org/services/cms_service.py b/app/ch06_routing/starter/pypi_org/services/cms_service.py index 23d67c38..18fc7b95 100644 --- a/app/ch06_routing/starter/pypi_org/services/cms_service.py +++ b/app/ch06_routing/starter/pypi_org/services/cms_service.py @@ -14,6 +14,7 @@ def get_page(url: str) -> dict: return {} url = url.strip().lower() + url = '/' + url.lstrip('/') page = fake_db.get(url, {}) return page diff --git a/app/ch06_routing/starter/pypi_org/templates/cms/about.html b/app/ch06_routing/starter/pypi_org/templates/cms/page.html similarity index 100% rename from app/ch06_routing/starter/pypi_org/templates/cms/about.html rename to app/ch06_routing/starter/pypi_org/templates/cms/page.html diff --git a/app/ch06_routing/starter/pypi_org/views/cms_views.py b/app/ch06_routing/starter/pypi_org/views/cms_views.py index 8180a24d..38888b22 100644 --- a/app/ch06_routing/starter/pypi_org/views/cms_views.py +++ b/app/ch06_routing/starter/pypi_org/views/cms_views.py @@ -5,11 +5,11 @@ blueprint = flask.Blueprint('cms', __name__, template_folder='templates') -@blueprint.route('/path:full_url') +@blueprint.route('/') @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(url) + page = cms_service.get_page(full_url) if not page: flask.abort(404) From 43953fdd291a2408508cfea074d987c927cb9c0f Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Thu, 27 Aug 2020 08:19:33 +0300 Subject: [PATCH 23/25] chapter09: sqlalchemy starting --- .../starter/pypi_org/views/home_views.py | 1 + app/ch09_sqlalchemy/starter/data/package.py | 12 ++++++++++++ app/ch09_sqlalchemy/starter/requirements.txt | 1 + .../final/pypi_org/views/home_views.py | 1 + 4 files changed, 15 insertions(+) create mode 100644 app/ch09_sqlalchemy/starter/data/package.py diff --git a/app/ch06_routing/starter/pypi_org/views/home_views.py b/app/ch06_routing/starter/pypi_org/views/home_views.py index de8d45c9..2f2f5813 100644 --- a/app/ch06_routing/starter/pypi_org/views/home_views.py +++ b/app/ch06_routing/starter/pypi_org/views/home_views.py @@ -2,6 +2,7 @@ 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') diff --git a/app/ch09_sqlalchemy/starter/data/package.py b/app/ch09_sqlalchemy/starter/data/package.py new file mode 100644 index 00000000..d3881ddb --- /dev/null +++ b/app/ch09_sqlalchemy/starter/data/package.py @@ -0,0 +1,12 @@ +import sqlalchemy as sa + +class Package: + + # primary key: globally unique - we changed to string as we use the package ID as name) + # could be an issue later to make a big migration + id = sa.Column(sa.String, primary_key=True) + created_date = datetime + desc = string + + + diff --git a/app/ch09_sqlalchemy/starter/requirements.txt b/app/ch09_sqlalchemy/starter/requirements.txt index 7e106024..36ecb361 100644 --- a/app/ch09_sqlalchemy/starter/requirements.txt +++ b/app/ch09_sqlalchemy/starter/requirements.txt @@ -1 +1,2 @@ flask +sqlalchemy \ No newline at end of file diff --git a/app/ch10_using_sqlachemy/final/pypi_org/views/home_views.py b/app/ch10_using_sqlachemy/final/pypi_org/views/home_views.py index c91ca873..1b3407de 100644 --- a/app/ch10_using_sqlachemy/final/pypi_org/views/home_views.py +++ b/app/ch10_using_sqlachemy/final/pypi_org/views/home_views.py @@ -3,6 +3,7 @@ from pypi_org.infrastructure.view_modifiers import response import pypi_org.services.package_service as package_service import pypi_org.services.user_service as user_service +import py blueprint = flask.Blueprint('home', __name__, template_folder='templates') From 064720ef4a3da70ff9be47e0bd5d22323204ae20 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Thu, 27 Aug 2020 08:22:17 +0300 Subject: [PATCH 24/25] chapter09: building Package table structure --- app/ch09_sqlalchemy/starter/data/package.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/ch09_sqlalchemy/starter/data/package.py b/app/ch09_sqlalchemy/starter/data/package.py index d3881ddb..b1f63f8a 100644 --- a/app/ch09_sqlalchemy/starter/data/package.py +++ b/app/ch09_sqlalchemy/starter/data/package.py @@ -1,12 +1,18 @@ import sqlalchemy as sa -class Package: +class Package: # primary key: globally unique - we changed to string as we use the package ID as name) # could be an issue later to make a big migration + # step 1: define data types + # step 2: wrap them in sqlalchemy syntax id = sa.Column(sa.String, primary_key=True) - created_date = datetime - desc = string + created_date = sa.Column(sa.DateTime) + summary = sa.Column(sa.String) + desc = sa.Column(sa.String) + home_page = sa.Column(sa.String) + docs_url = sa.Column(sa.String) + package_url = sa.Column(sa.String) From 1bb7af394a76ea727dd9e28a64eea419b38b3ea4 Mon Sep 17 00:00:00 2001 From: Chris Dietrich Date: Thu, 27 Aug 2020 08:23:29 +0300 Subject: [PATCH 25/25] chapter09: building Package table structure --- app/ch09_sqlalchemy/starter/data/package.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/ch09_sqlalchemy/starter/data/package.py b/app/ch09_sqlalchemy/starter/data/package.py index b1f63f8a..329daa5e 100644 --- a/app/ch09_sqlalchemy/starter/data/package.py +++ b/app/ch09_sqlalchemy/starter/data/package.py @@ -15,4 +15,11 @@ class Package: docs_url = sa.Column(sa.String) package_url = sa.Column(sa.String) + author_name = sa.Column(sa.String) + author_email = sa.Column(sa.String) + license = sa.Column(sa.String) + + # these we add later as they have relations + # maintainers + # releases \ No newline at end of file