Skip to content

Commit 14a32f0

Browse files
committed
add more flask code examples
1 parent 5996ef9 commit 14a32f0

13 files changed

+1469
-23
lines changed

content/pages/examples/flask/flask-app-flask.markdown

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,90 @@ from app.models import User
457457
```
458458

459459

460-
## Example 8 from Flasky
460+
## Example 8 from Flask-User
461+
[Flask-User](https://github.com/lingthio/Flask-User)
462+
([PyPI information](https://pypi.org/project/Flask-User/)
463+
and
464+
[project documentation](https://flask-user.readthedocs.io/en/latest/))
465+
is a [Flask](/flask.html) extension that makes it easier to add
466+
custom user account management and authentication to the projects
467+
you are building. The extension supports persistent data storage
468+
through both [relational databases](/databases.html) and
469+
[MongoDB](/mongodb.html). The project is provided as open source under
470+
the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt).
471+
472+
[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py)
473+
474+
```python
475+
# user_manager.py
476+
477+
478+
import datetime
479+
480+
~~from flask import abort, Blueprint, current_app, Flask, session
481+
from flask_login import LoginManager
482+
from wtforms import ValidationError
483+
484+
from . import ConfigError
485+
from . import forms
486+
from .db_manager import DBManager
487+
from .email_manager import EmailManager
488+
from .password_manager import PasswordManager
489+
from .token_manager import TokenManager
490+
from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext()
491+
from .user_manager__settings import UserManager__Settings
492+
from .user_manager__utils import UserManager__Utils
493+
from .user_manager__views import UserManager__Views
494+
495+
496+
class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views):
497+
498+
def __init__(self, app, db, UserClass, **kwargs):
499+
500+
self.app = app
501+
if app:
502+
self.init_app(app, db, UserClass, **kwargs)
503+
504+
def init_app(
505+
self, app, db, UserClass,
506+
UserInvitationClass=None,
507+
UserEmailClass=None,
508+
RoleClass=None, # Only used for testing
509+
):
510+
511+
~~ if not isinstance(app, Flask):
512+
raise TypeError("flask_user.UserManager.init_app(): Parameter 'app' is an instance of class '%s' "
513+
"instead of a subclass of class 'flask.Flask'."
514+
% app.__class__.__name__)
515+
516+
app.user_manager = self
517+
518+
self.db = db
519+
520+
for attrib_name in dir(self):
521+
if attrib_name[0:5] == 'USER_':
522+
default_value = getattr(UserManager, attrib_name)
523+
setattr(self, attrib_name, app.config.get(attrib_name, default_value))
524+
525+
if not self.USER_EMAIL_SENDER_EMAIL:
526+
default_sender = app.config.get('DEFAULT_MAIL_SENDER', None)
527+
default_sender = app.config.get('MAIL_DEFAULT_SENDER', default_sender)
528+
if default_sender:
529+
if default_sender[-1:] == '>':
530+
start = default_sender.rfind('<')
531+
if start >= 1:
532+
self.USER_EMAIL_SENDER_EMAIL = default_sender[start + 1:-1]
533+
if not self.USER_EMAIL_SENDER_NAME:
534+
self.USER_EMAIL_SENDER_NAME = default_sender[0:start].strip(' "')
535+
else:
536+
537+
538+
## ... source file continues with no further Flask examples...
539+
540+
```
541+
542+
543+
## Example 9 from Flasky
461544
[Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful
462545
example application by
463546
[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds
@@ -521,7 +604,7 @@ def create_app(config_name):
521604
```
522605

523606

524-
## Example 9 from Datadog Flask Example App
607+
## Example 10 from Datadog Flask Example App
525608
The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask)
526609
contains many examples of the [Flask](/flask.html) core functions
527610
available to a developer using the [web framework](/web-frameworks.html).
@@ -582,7 +665,7 @@ def before_request():
582665
```
583666

584667

585-
## Example 10 from sandman2
668+
## Example 11 from sandman2
586669
[sandman2](https://github.com/jeffknupp/sandman2)
587670
([project documentation](https://sandman2.readthedocs.io/en/latest/)
588671
and
@@ -663,7 +746,7 @@ def get_app(
663746
```
664747

665748

666-
## Example 11 from tedivms-flask
749+
## Example 12 from tedivms-flask
667750
[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a
668751
base of [Flask](/flask.html) code and related projects such as
669752
[Celery](/celery.html) which provides a template to start your own

content/pages/examples/flask/flask-blueprints-blueprint.markdown

Lines changed: 109 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,114 @@ def generate_csrf(secret_key=None, token_key=None):
549549
```
550550

551551

552-
## Example 8 from Datadog Flask Example App
552+
## Example 8 from Flask-User
553+
[Flask-User](https://github.com/lingthio/Flask-User)
554+
([PyPI information](https://pypi.org/project/Flask-User/)
555+
and
556+
[project documentation](https://flask-user.readthedocs.io/en/latest/))
557+
is a [Flask](/flask.html) extension that makes it easier to add
558+
custom user account management and authentication to the projects
559+
you are building. The extension supports persistent data storage
560+
through both [relational databases](/databases.html) and
561+
[MongoDB](/mongodb.html). The project is provided as open source under
562+
the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt).
563+
564+
[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py)
565+
566+
```python
567+
# user_manager.py
568+
569+
570+
import datetime
571+
572+
~~from flask import abort, Blueprint, current_app, Flask, session
573+
from flask_login import LoginManager
574+
from wtforms import ValidationError
575+
576+
from . import ConfigError
577+
from . import forms
578+
from .db_manager import DBManager
579+
from .email_manager import EmailManager
580+
from .password_manager import PasswordManager
581+
from .token_manager import TokenManager
582+
from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext()
583+
from .user_manager__settings import UserManager__Settings
584+
from .user_manager__utils import UserManager__Utils
585+
from .user_manager__views import UserManager__Views
586+
587+
588+
class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views):
589+
590+
def __init__(self, app, db, UserClass, **kwargs):
591+
592+
self.app = app
593+
if app:
594+
self.init_app(app, db, UserClass, **kwargs)
595+
596+
def init_app(
597+
598+
599+
## ... source file abbreviated to get to Blueprint examples ...
600+
601+
602+
603+
@self.login_manager.user_loader
604+
def load_user_by_user_token(user_token):
605+
user = self.db_manager.UserClass.get_user_by_token(user_token)
606+
return user
607+
608+
self.babel = app.extensions.get('babel', None)
609+
from .translation_utils import init_translations
610+
init_translations(self.babel)
611+
612+
if not hasattr(app.jinja_env, 'install_gettext_callables'):
613+
app.jinja_env.add_extension('jinja2.ext.i18n')
614+
app.jinja_env.install_null_translations()
615+
616+
def flask_user_context_processor():
617+
def call_or_get(function_or_property):
618+
return function_or_property() if callable(function_or_property) else function_or_property
619+
620+
return dict(
621+
user_manager=current_app.user_manager,
622+
call_or_get=call_or_get,
623+
)
624+
625+
app.context_processor(flask_user_context_processor)
626+
627+
~~ blueprint = Blueprint('flask_user', __name__, template_folder='templates')
628+
app.register_blueprint(blueprint)
629+
630+
self.AddEmailFormClass = forms.AddEmailForm
631+
self.ChangePasswordFormClass = forms.ChangePasswordForm
632+
self.ChangeUsernameFormClass = forms.ChangeUsernameForm
633+
self.EditUserProfileFormClass = forms.EditUserProfileForm
634+
self.ForgotPasswordFormClass = forms.ForgotPasswordForm
635+
self.InviteUserFormClass = forms.InviteUserForm
636+
self.LoginFormClass = forms.LoginForm
637+
self.RegisterFormClass = forms.RegisterForm
638+
self.ResendEmailConfirmationFormClass = forms.ResendEmailConfirmationForm
639+
self.ResetPasswordFormClass = forms.ResetPasswordForm
640+
641+
self.db_manager = DBManager(app, db, UserClass, UserEmailClass, UserInvitationClass, RoleClass)
642+
643+
self.password_manager = PasswordManager(app)
644+
645+
if self.USER_ENABLE_EMAIL:
646+
from .email_adapters.smtp_email_adapter import SMTPEmailAdapter
647+
self.email_adapter = SMTPEmailAdapter(app)
648+
649+
if self.USER_ENABLE_EMAIL:
650+
self.email_manager = EmailManager(app)
651+
652+
653+
654+
## ... source file continues with no further Blueprint examples...
655+
656+
```
657+
658+
659+
## Example 9 from Datadog Flask Example App
553660
The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask)
554661
contains many examples of the [Flask](/flask.html) core functions
555662
available to a developer using the [web framework](/web-frameworks.html).
@@ -596,7 +703,7 @@ def bp_after_request(response):
596703
```
597704

598705

599-
## Example 9 from tedivms-flask
706+
## Example 10 from tedivms-flask
600707
[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a
601708
base of [Flask](/flask.html) code and related projects such as
602709
[Celery](/celery.html) which provides a template to start your own

content/pages/examples/flask/flask-extensions-plug-ins.markdown

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,19 @@ The Flask-Security-Too project is provided as open source under the
118118
[MIT license](https://github.com/Flask-Middleware/flask-security/blob/master/LICENSE).
119119

120120

121+
### Flask-User
122+
[Flask-User](https://github.com/lingthio/Flask-User)
123+
([PyPI information](https://pypi.org/project/Flask-User/)
124+
and
125+
[project documentation](https://flask-user.readthedocs.io/en/latest/))
126+
is a [Flask](/flask.html) extension that makes it easier to add
127+
custom user account management and authentication to the projects
128+
you are building. The extension supports persistent data storage
129+
through both [relational databases](/databases.html) and
130+
[MongoDB](/mongodb.html). The project is provided as open source under
131+
the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt).
132+
133+
121134
### Flask-WTF
122135
[Flask-WTF](https://github.com/lepture/flask-wtf)
123136
([project documentation](https://flask-wtf.readthedocs.io/en/stable/)

content/pages/examples/flask/flask-globals-current-app.markdown

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,114 @@ _default_config = {
18891889
```
18901890

18911891

1892-
## Example 12 from Flasky
1892+
## Example 12 from Flask-User
1893+
[Flask-User](https://github.com/lingthio/Flask-User)
1894+
([PyPI information](https://pypi.org/project/Flask-User/)
1895+
and
1896+
[project documentation](https://flask-user.readthedocs.io/en/latest/))
1897+
is a [Flask](/flask.html) extension that makes it easier to add
1898+
custom user account management and authentication to the projects
1899+
you are building. The extension supports persistent data storage
1900+
through both [relational databases](/databases.html) and
1901+
[MongoDB](/mongodb.html). The project is provided as open source under
1902+
the [MIT license](https://github.com/lingthio/Flask-User/blob/master/LICENSE.txt).
1903+
1904+
[**Flask-User / flask_user / user_manager.py**](https://github.com/lingthio/Flask-User/blob/master/flask_user/./user_manager.py)
1905+
1906+
```python
1907+
# user_manager.py
1908+
1909+
1910+
import datetime
1911+
1912+
~~from flask import abort, Blueprint, current_app, Flask, session
1913+
from flask_login import LoginManager
1914+
from wtforms import ValidationError
1915+
1916+
from . import ConfigError
1917+
from . import forms
1918+
from .db_manager import DBManager
1919+
from .email_manager import EmailManager
1920+
from .password_manager import PasswordManager
1921+
from .token_manager import TokenManager
1922+
from .translation_utils import lazy_gettext as _ # map _() to lazy_gettext()
1923+
from .user_manager__settings import UserManager__Settings
1924+
from .user_manager__utils import UserManager__Utils
1925+
from .user_manager__views import UserManager__Views
1926+
1927+
1928+
class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views):
1929+
1930+
def __init__(self, app, db, UserClass, **kwargs):
1931+
1932+
self.app = app
1933+
if app:
1934+
self.init_app(app, db, UserClass, **kwargs)
1935+
1936+
def init_app(
1937+
1938+
1939+
## ... source file abbreviated to get to current_app examples ...
1940+
1941+
1942+
def advance_session_timeout():
1943+
session.permanent = True # Timeout after app.permanent_session_lifetime period
1944+
session.modified = True # Advance session timeout each time a user visits a page
1945+
1946+
self.login_manager = LoginManager(app)
1947+
self.login_manager.login_view = 'user.login'
1948+
1949+
@self.login_manager.user_loader
1950+
def load_user_by_user_token(user_token):
1951+
user = self.db_manager.UserClass.get_user_by_token(user_token)
1952+
return user
1953+
1954+
self.babel = app.extensions.get('babel', None)
1955+
from .translation_utils import init_translations
1956+
init_translations(self.babel)
1957+
1958+
if not hasattr(app.jinja_env, 'install_gettext_callables'):
1959+
app.jinja_env.add_extension('jinja2.ext.i18n')
1960+
app.jinja_env.install_null_translations()
1961+
1962+
def flask_user_context_processor():
1963+
def call_or_get(function_or_property):
1964+
return function_or_property() if callable(function_or_property) else function_or_property
1965+
1966+
return dict(
1967+
~~ user_manager=current_app.user_manager,
1968+
call_or_get=call_or_get,
1969+
)
1970+
1971+
app.context_processor(flask_user_context_processor)
1972+
1973+
blueprint = Blueprint('flask_user', __name__, template_folder='templates')
1974+
app.register_blueprint(blueprint)
1975+
1976+
self.AddEmailFormClass = forms.AddEmailForm
1977+
self.ChangePasswordFormClass = forms.ChangePasswordForm
1978+
self.ChangeUsernameFormClass = forms.ChangeUsernameForm
1979+
self.EditUserProfileFormClass = forms.EditUserProfileForm
1980+
self.ForgotPasswordFormClass = forms.ForgotPasswordForm
1981+
self.InviteUserFormClass = forms.InviteUserForm
1982+
self.LoginFormClass = forms.LoginForm
1983+
self.RegisterFormClass = forms.RegisterForm
1984+
self.ResendEmailConfirmationFormClass = forms.ResendEmailConfirmationForm
1985+
self.ResetPasswordFormClass = forms.ResetPasswordForm
1986+
1987+
self.db_manager = DBManager(app, db, UserClass, UserEmailClass, UserInvitationClass, RoleClass)
1988+
1989+
self.password_manager = PasswordManager(app)
1990+
1991+
if self.USER_ENABLE_EMAIL:
1992+
1993+
1994+
## ... source file continues with no further current_app examples...
1995+
1996+
```
1997+
1998+
1999+
## Example 13 from Flasky
18932000
[Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful
18942001
example application by
18952002
[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds
@@ -1944,7 +2051,7 @@ def run_migrations_online():
19442051
```
19452052

19462053

1947-
## Example 13 from sandman2
2054+
## Example 14 from sandman2
19482055
[sandman2](https://github.com/jeffknupp/sandman2)
19492056
([project documentation](https://sandman2.readthedocs.io/en/latest/)
19502057
and
@@ -2069,7 +2176,7 @@ def register_model(cls, admin=None):
20692176
```
20702177

20712178

2072-
## Example 14 from tedivms-flask
2179+
## Example 15 from tedivms-flask
20732180
[tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a
20742181
base of [Flask](/flask.html) code and related projects such as
20752182
[Celery](/celery.html) which provides a template to start your own

0 commit comments

Comments
 (0)