Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
flask-admin
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Python-Dev
flask-admin
Commits
15581d05
Commit
15581d05
authored
May 24, 2015
by
Petrus J.v.Rensburg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename 'auth' example.
parent
74af8ab8
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
306 additions
and
0 deletions
+306
-0
README.rst
examples/auth-flask-login/README.rst
+27
-0
__init__.py
examples/auth-flask-login/__init__.py
+0
-0
app.py
examples/auth-flask-login/app.py
+215
-0
requirements.txt
examples/auth-flask-login/requirements.txt
+4
-0
index.html
examples/auth-flask-login/templates/admin/index.html
+39
-0
index.html
examples/auth-flask-login/templates/index.html
+7
-0
my_master.html
examples/auth-flask-login/templates/my_master.html
+14
-0
No files found.
examples/auth-flask-login/README.rst
0 → 100644
View file @
15581d05
This example shows how to integrate Flask-Login authentication with Flask-Admin using the SQLAlchemy backend.
To run this example:
1. Clone the repository::
git clone https://github.com/flask-admin/flask-admin.git
cd flask-admin
2. Create and activate a virtual environment::
virtualenv env
source env/bin/activate
3. Install requirements::
pip install -r 'examples/auth-flask-login/requirements.txt'
4. Run the application::
python examples/auth-flask-login/app.py
The first time you run this example, a sample sqlite database gets populated automatically. To suppress this behaviour,
comment the following lines in app.py:::
if not os.path.exists(database_path):
build_sample_db()
examples/auth-flask-login/__init__.py
0 → 100644
View file @
15581d05
examples/auth-flask-login/app.py
0 → 100644
View file @
15581d05
import
os
from
flask
import
Flask
,
url_for
,
redirect
,
render_template
,
request
from
flask_sqlalchemy
import
SQLAlchemy
from
wtforms
import
form
,
fields
,
validators
import
flask_admin
as
admin
import
flask_login
as
login
from
flask_admin.contrib
import
sqla
from
flask_admin
import
helpers
,
expose
from
werkzeug.security
import
generate_password_hash
,
check_password_hash
# Create Flask application
app
=
Flask
(
__name__
)
# Create dummy secrey key so we can use sessions
app
.
config
[
'SECRET_KEY'
]
=
'123456790'
# Create in-memory database
app
.
config
[
'DATABASE_FILE'
]
=
'sample_db.sqlite'
app
.
config
[
'SQLALCHEMY_DATABASE_URI'
]
=
'sqlite:///'
+
app
.
config
[
'DATABASE_FILE'
]
app
.
config
[
'SQLALCHEMY_ECHO'
]
=
True
db
=
SQLAlchemy
(
app
)
# Create user model.
class
User
(
db
.
Model
):
id
=
db
.
Column
(
db
.
Integer
,
primary_key
=
True
)
first_name
=
db
.
Column
(
db
.
String
(
100
))
last_name
=
db
.
Column
(
db
.
String
(
100
))
login
=
db
.
Column
(
db
.
String
(
80
),
unique
=
True
)
email
=
db
.
Column
(
db
.
String
(
120
))
password
=
db
.
Column
(
db
.
String
(
64
))
# Flask-Login integration
def
is_authenticated
(
self
):
return
True
def
is_active
(
self
):
return
True
def
is_anonymous
(
self
):
return
False
def
get_id
(
self
):
return
self
.
id
# Required for administrative interface
def
__unicode__
(
self
):
return
self
.
username
# Define login and registration forms (for flask-login)
class
LoginForm
(
form
.
Form
):
login
=
fields
.
TextField
(
validators
=
[
validators
.
required
()])
password
=
fields
.
PasswordField
(
validators
=
[
validators
.
required
()])
def
validate_login
(
self
,
field
):
user
=
self
.
get_user
()
if
user
is
None
:
raise
validators
.
ValidationError
(
'Invalid user'
)
# we're comparing the plaintext pw with the the hash from the db
if
not
check_password_hash
(
user
.
password
,
self
.
password
.
data
):
# to compare plain text passwords use
# if user.password != self.password.data:
raise
validators
.
ValidationError
(
'Invalid password'
)
def
get_user
(
self
):
return
db
.
session
.
query
(
User
)
.
filter_by
(
login
=
self
.
login
.
data
)
.
first
()
class
RegistrationForm
(
form
.
Form
):
login
=
fields
.
TextField
(
validators
=
[
validators
.
required
()])
email
=
fields
.
TextField
()
password
=
fields
.
PasswordField
(
validators
=
[
validators
.
required
()])
def
validate_login
(
self
,
field
):
if
db
.
session
.
query
(
User
)
.
filter_by
(
login
=
self
.
login
.
data
)
.
count
()
>
0
:
raise
validators
.
ValidationError
(
'Duplicate username'
)
# Initialize flask-login
def
init_login
():
login_manager
=
login
.
LoginManager
()
login_manager
.
init_app
(
app
)
# Create user loader function
@
login_manager
.
user_loader
def
load_user
(
user_id
):
return
db
.
session
.
query
(
User
)
.
get
(
user_id
)
# Create customized model view class
class
MyModelView
(
sqla
.
ModelView
):
def
is_accessible
(
self
):
return
login
.
current_user
.
is_authenticated
()
# Create customized index view class that handles login & registration
class
MyAdminIndexView
(
admin
.
AdminIndexView
):
@
expose
(
'/'
)
def
index
(
self
):
if
not
login
.
current_user
.
is_authenticated
():
return
redirect
(
url_for
(
'.login_view'
))
return
super
(
MyAdminIndexView
,
self
)
.
index
()
@
expose
(
'/login/'
,
methods
=
(
'GET'
,
'POST'
))
def
login_view
(
self
):
# handle user login
form
=
LoginForm
(
request
.
form
)
if
helpers
.
validate_form_on_submit
(
form
):
user
=
form
.
get_user
()
login
.
login_user
(
user
)
if
login
.
current_user
.
is_authenticated
():
return
redirect
(
url_for
(
'.index'
))
link
=
'<p>Don
\'
t have an account? <a href="'
+
url_for
(
'.register_view'
)
+
'">Click here to register.</a></p>'
self
.
_template_args
[
'form'
]
=
form
self
.
_template_args
[
'link'
]
=
link
return
super
(
MyAdminIndexView
,
self
)
.
index
()
@
expose
(
'/register/'
,
methods
=
(
'GET'
,
'POST'
))
def
register_view
(
self
):
form
=
RegistrationForm
(
request
.
form
)
if
helpers
.
validate_form_on_submit
(
form
):
user
=
User
()
form
.
populate_obj
(
user
)
# we hash the users password to avoid saving it as plaintext in the db,
# remove to use plain text:
user
.
password
=
generate_password_hash
(
form
.
password
.
data
)
db
.
session
.
add
(
user
)
db
.
session
.
commit
()
login
.
login_user
(
user
)
return
redirect
(
url_for
(
'.index'
))
link
=
'<p>Already have an account? <a href="'
+
url_for
(
'.login_view'
)
+
'">Click here to log in.</a></p>'
self
.
_template_args
[
'form'
]
=
form
self
.
_template_args
[
'link'
]
=
link
return
super
(
MyAdminIndexView
,
self
)
.
index
()
@
expose
(
'/logout/'
)
def
logout_view
(
self
):
login
.
logout_user
()
return
redirect
(
url_for
(
'.index'
))
# Flask views
@
app
.
route
(
'/'
)
def
index
():
return
render_template
(
'index.html'
)
# Initialize flask-login
init_login
()
# Create admin
admin
=
admin
.
Admin
(
app
,
'Example: Auth'
,
index_view
=
MyAdminIndexView
(),
base_template
=
'my_master.html'
)
# Add view
admin
.
add_view
(
MyModelView
(
User
,
db
.
session
))
def
build_sample_db
():
"""
Populate a small db with some example entries.
"""
import
string
import
random
db
.
drop_all
()
db
.
create_all
()
# passwords are hashed, to use plaintext passwords instead:
# test_user = User(login="test", password="test")
test_user
=
User
(
login
=
"test"
,
password
=
generate_password_hash
(
"test"
))
db
.
session
.
add
(
test_user
)
first_names
=
[
'Harry'
,
'Amelia'
,
'Oliver'
,
'Jack'
,
'Isabella'
,
'Charlie'
,
'Sophie'
,
'Mia'
,
'Jacob'
,
'Thomas'
,
'Emily'
,
'Lily'
,
'Ava'
,
'Isla'
,
'Alfie'
,
'Olivia'
,
'Jessica'
,
'Riley'
,
'William'
,
'James'
,
'Geoffrey'
,
'Lisa'
,
'Benjamin'
,
'Stacey'
,
'Lucy'
]
last_names
=
[
'Brown'
,
'Smith'
,
'Patel'
,
'Jones'
,
'Williams'
,
'Johnson'
,
'Taylor'
,
'Thomas'
,
'Roberts'
,
'Khan'
,
'Lewis'
,
'Jackson'
,
'Clarke'
,
'James'
,
'Phillips'
,
'Wilson'
,
'Ali'
,
'Mason'
,
'Mitchell'
,
'Rose'
,
'Davis'
,
'Davies'
,
'Rodriguez'
,
'Cox'
,
'Alexander'
]
for
i
in
range
(
len
(
first_names
)):
user
=
User
()
user
.
first_name
=
first_names
[
i
]
user
.
last_name
=
last_names
[
i
]
user
.
login
=
user
.
first_name
.
lower
()
user
.
email
=
user
.
login
+
"@example.com"
user
.
password
=
generate_password_hash
(
''
.
join
(
random
.
choice
(
string
.
ascii_lowercase
+
string
.
digits
)
for
i
in
range
(
10
)))
db
.
session
.
add
(
user
)
db
.
session
.
commit
()
return
if
__name__
==
'__main__'
:
# Build a sample db on the fly, if one does not exist yet.
app_dir
=
os
.
path
.
realpath
(
os
.
path
.
dirname
(
__file__
))
database_path
=
os
.
path
.
join
(
app_dir
,
app
.
config
[
'DATABASE_FILE'
])
if
not
os
.
path
.
exists
(
database_path
):
build_sample_db
()
# Start app
app
.
run
(
debug
=
True
)
examples/auth-flask-login/requirements.txt
0 → 100644
View file @
15581d05
Flask
Flask-Admin
Flask-SQLAlchemy
Flask-Login
examples/auth-flask-login/templates/admin/index.html
0 → 100644
View file @
15581d05
{% extends 'admin/master.html' %}
{% block body %}
{{ super() }}
<div
class=
"row-fluid"
>
<div>
{% if current_user.is_authenticated() %}
<h1>
Flask-Admin example
</h1>
<p
class=
"lead"
>
Authentication
</p>
<p>
This example shows how you can use Flask-Login for authentication. It is only intended as a basic demonstration.
</p>
{% else %}
<form
method=
"POST"
action=
""
>
{{ form.hidden_tag() if form.hidden_tag }}
{% for f in form if f.type != 'CSRFTokenField' %}
<div>
{{ f.label }}
{{ f }}
{% if f.errors %}
<ul>
{% for e in f.errors %}
<li>
{{ e }}
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% endfor %}
<button
class=
"btn"
type=
"submit"
>
Submit
</button>
</form>
{{ link | safe }}
{% endif %}
</div>
<a
class=
"btn btn-primary"
href=
"/"
><i
class=
"icon-arrow-left icon-white"
></i>
Back
</a>
</div>
{% endblock body %}
\ No newline at end of file
examples/auth-flask-login/templates/index.html
0 → 100644
View file @
15581d05
<html>
<body>
<div>
<a
href=
"{{ url_for('admin.index') }}"
>
Go to admin!
</a>
</div>
</body>
</html>
examples/auth-flask-login/templates/my_master.html
0 → 100644
View file @
15581d05
{% extends 'admin/base.html' %}
{% block access_control %}
{% if current_user.is_authenticated() %}
<div
class=
"btn-group pull-right"
>
<a
class=
"btn dropdown-toggle"
data-toggle=
"dropdown"
href=
"#"
>
<i
class=
"icon-user"
></i>
{{ current_user.login }}
<span
class=
"caret"
></span>
</a>
<ul
class=
"dropdown-menu"
>
<li><a
href=
"{{ url_for('admin.logout_view') }}"
>
Log out
</a></li>
</ul>
</div>
{% endif %}
{% endblock %}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment