_
for parameter: _
external¶url_for("index") # "/"
url_for("index", _external=True) # "http://127.0.0.1:5000/"
url_for("user", name="maomao", _external=True) # "http://127.0.0.1:5000/user/maomao"
url_for("index", page=2, _external=True) # "http://127.0.0.1:5000/?page=2"
<
a href="/">
by url_for()¶<!-- templates/base.html -->
{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle"
data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{{ home }}">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="{{ home }}">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% endblock %}
<!-- templates/user.html -->
{% extends "base.html" %}
{% block title %}Flasky - Welcom{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello, {{ name }}!</h1>
</div>
{% endblock %}
from flask import url_for
@app.route("/user/<name>")
def user(name):
home = url_for("index", _external=True)
return render_template("user.html", name=name, home=home)
<!-- templates/base.html -->
{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle"
data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{{ url_for('index', _external=True) }}">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="{{ url_for('index', _external=True) }}">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% endblock %}
<
filename>
<!-- templates/base.html -->
{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
<link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle"
data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{{ url_for('index', _external=True) }}">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="{{ url_for('index', _external=True) }}">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
{% block page_content %}{% endblock %}
</div>
{% endblock %}
$
git clone https://github.com/win911/flask_class.git$
git checkout 35d00bfrom flask import Flask
app = Flask(__name__, static_folder="my_static")
moment
class varialble to tempaltes for rendering.format('LLL')
determines the rendering style, from 'L
' to 'LLLL
'.L
: Month numeral, day of month, year (EX: 08/27/2017)LL
: Month name, day of month, year (EX: August 27, 2017)LLL
: Month name, day of month, year, time (EX: August 27, 2017 5:32 PM)LLLL
: Day of week, month name, day of month, year, time (EX: Sunday, August 27, 2017 5:37 PM)<!-- templates/index.html -->
{% extends "base.html" %}
{% block title %}Flasky - Index{% endblock %}
{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}
{% block page_content %}
<div class="page-header">
<p>The local data and time is {{ moment(current_time).format('LLL') }}.</p>
<p>That was {{ moment(current_time).fromNow(refresh = True) }}</p>
</div>
{% endblock %}
# hello.py
from datetime import datetime
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_moment import Moment
#from flask.ext.bootstrap import Bootstrap
#from flask.ext.moment import Moment
app = Flask(__name__)
bootstrap = Bootstrap(app)
moment = Moment(app)
@app.route('/')
def index():
return render_template('index.html', current_time = datetime.utcnow())
if __name__ == "__main__":
app.run(debug=True)
$
git clone https://github.com/win911/flask_class.git$
git checkout b0bcf5# hello.py
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
if request.headers["Content-Type"] == "application/json":
return "<p>JSON Data: {}</p>".format(request.json)
elif request.headers["Content-Type"] == "application/x-www-form-urlencoded":
return "<p>Form Data: {}</p>".format(request.form)
return "<p>Other Types Data: {}</p>".format(request.data)
return "<p>Hello</p>"
if __name__ == "__main__":
app.run(debug=True)
FlaskForm
.<!-- tempaltes/index.html -->
{% if name %}
<p>Hello, {{ name }}!</p>
{% else %}
<p>Hello, Stranger!</p>
{% endif %}
<form method="POST">
{{ form.hidden_tag() }} <!-- Important for CSRF token -->
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>
# hello.py
from flask import Flask, render_template
from flask_wtf import FlaskForm
#from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
app = Flask(__name__)
app.config["SECRET_KEY"] = "hard to guess string" # Important for CSRF token
class NameForm(FlaskForm):
name = StringField("What is your name?", validators=[Required()])
submit = SubmitField("Submit")
@app.route("/", methods=["GET", "POST"])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ""
return render_template("index.html", form=form, name=name)
if __name__ == "__main__":
app.run(debug= True)
<!-- tempaltes/index.html -->
{% if name %}
<p>Hello, {{ name }}!</p>
{% else %}
<p>Hello, Stranger!</p>
{% endif %}
<form method="POST">
{{ form.hidden_tag() }} <!-- Important for CSRF token -->
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>
{% for field in form.errors %}
<p style="color:red">{{ field }}:</p>
<ul>
{% for detail in form.errors[field] %}
<li style="color:red">{{ detail }}</li>
{% endfor %}
</ul>
{% endfor %}
<!-- tempaltes/index.html -->
{% if name %}
<p>Hello, {{ name }}!</p>
{% else %}
<p>Hello, Stranger!</p>
{% endif %}
<form method="POST">
{{ form.hidden_tag() }} <!-- Important for CSRF token -->
{{ form.name.label }} {{ form.name(id='my-text-field', class='text-field') }}
{{ form.submit() }}
</form>
{% for field in form.errors %}
<p style="color:red">{{ field }}:</p>
<ul>
{% for detail in form.errors[field] %}
<li style="color:red">{{ detail }}</li>
{% endfor %}
</ul>
{% endfor %}
<!-- tempaltes/index.html -->
{% if name %}
<p>Hello, {{ name }}!</p>
{% else %}
<p>Hello, Stranger!</p>
{% endif %}
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
# hello.py
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
#from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
app = Flask(__name__)
app.config["SECRET_KEY"] = "hard to guess string" # Important for CSRF token
bootstrap = Bootstrap(app)
class NameForm(FlaskForm):
name = StringField("What is your name?", validators=[Required()])
submit = SubmitField("Submit")
@app.route("/", methods=["GET", "POST"])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ""
return render_template("index.html", form=form, name=name)
if __name__ == "__main__":
app.run(debug=True)
<!-- tempaltes/index.html -->
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}
$
git clone https://github.com/win911/flask_class.git$
git checkout 42a607from flask import session, redirect, url_for
@app.route("/", methods=["GET", "POST"])
def index():
form = NameForm()
if form.validate_on_submit():
session["name"] = form.name.data
return redirect(url_for("index"))
return render_template("index.html", form=form, name=session.get("name"))
<!-- tempaltes/index.html -->
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block content %}
<div class="container">
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ message }}
</div>
{% endfor %}
{% block page_content %}
<div class="page-header">
<h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}
</div>
{% endblock %}
from flask import flash
@app.route("/", methods=["GET", "POST"])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get("name")
if old_name is not None and old_name != form.name.data:
flash("Looks like you have changed your name!")
session["name"] = form.name.data
return redirect(url_for("index"))
return render_template("index.html", form=form, name=session.get("name"))
$
git clone https://github.com/win911/flask_class.git$
git checkout 70179dsmtplib
and integrates it with Flask.Key | Default | Description |
---|---|---|
MAIL_HOSTNAME | localhost | Hoastname or IP address of teh email server |
MAIL_PORT | 25 | Port of the email server |
MAIL_USE_TLS | False | Enable Transport Layer Security (TLS) secruity |
MAIL_USE_SSL | False | Enable Secure Sockets layer (SSL) security |
MAIL_USERNAME | None | Mail account username |
MAIL_PASSWORD | None | Mail account password |
# hello_email.py
import os
from flask import Flask
from flask_mail import Mail
#from flask.ext.mail import Mail
from flask_script import Manager
app = Flask(__name__)
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
app.config["DEBUG"] = True
mail = Mail(app)
manager = Manager(app)
if __name__ == "__main__":
manager.run()
MAIL_USERNAME
and MAIL_PASSWORD
to the environment¶Mac OS X
(venv) $ export MAIL_USERNAME=<Gmail username>
(venv) $ export MAIL_PASSWORD=<Gmail password>
Microsoft Windows
(venv) $ set MAIL_USERNAME=<Gmail username>
(venv) $ set MAIL_PASSWORD=<Gmail password>
(venv) $ python hello_email.py shell
>>> from flask_mail import Message
>>> from hello_email import mail
>>> msg = Message('test subject', sender='you@example.com', recipients=['you@example.com'])
>>> msg.body = 'text body'
>>> msg.html = '<b>HTML</b> body'
>>> with app.app_context():
... mail.send(msg)
...
index()
view function to send email¶FLAKSY_AMDIN
to the environment¶Mac OS X
(venv) $ export FLASKY_ADMIN=<Gmail username>
Microsoft Windows
(venv) $ set FLASKY_ADMIN=<Gmail username>
User {{ user }} has joined.
<!-- templates/mail/new_user.html -->
<p> User <b>{{ user }}</b> has joined. </p>
# hello.py
import os
from flask import Flask, render_template
from flask import session, redirect, url_for
from flask import flash
from flask_bootstrap import Bootstrap
from flask_mail import Mail, Message
#from flask.ext.mail import Mail, Message
from flask_script import Manager
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import Required
app = Flask(__name__)
app.config["SECRET_KEY"] = "hard to guess string" # Important for CSRF token
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') # do not write information here directly
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') # do not write information here directly
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <your-email@example.com>'
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN') # do not write information here directly
app.config['DEBUG'] = True
manager = Manager(app)
bootstrap = Bootstrap(app)
mail = Mail(app)
class NameForm(FlaskForm):
name = StringField("What is your name?", validators=[Required()])
submit = SubmitField("Submit")
def send_email(to, subject, template, **kwargs):
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)
mail.send(msg)
@app.route("/", methods=["GET", "POST"])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get("name")
if old_name is not None and old_name != form.name.data:
send_email(to=app.config['FLASKY_ADMIN'], subject='New User',
template='mail/new_user', user=form.name.data)
session["name"] = form.name.data
return redirect(url_for("index"))
return render_template("index.html", form=form, name=session.get("name"))
if __name__ == '__main__':
manager.run()
source: wikipedia
# hello.py
from threading import Thread
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
def send_email(to, subject, template, **kwargs):
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)
thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return thr
$
git clone https://github.com/win911/flask_class.git$
git checkout b95022jsonschema
package and integrates it with Flaskapp.config['JSONSCHEMA_DIR'] = os.path.join(app.root_path, 'schemas')
{
"type": "object",
"properties": {
"title": {"type": "string", "maxLength": 50, "minLength": 10},
"author": {"type": "string", "maxLength": 30, "minLength": 1}
},
"required": ["title", "author"]
}
# hello_json.py
import os
from flask import Flask, request
from flask_jsonschema import JsonSchema, ValidationError
app = Flask(__name__)
app.config["JSONSCHEMA_DIR"] = os.path.join(app.root_path, "schemas")
jsonschema = JsonSchema(app)
@app.errorhandler(ValidationError)
def on_validation_error(e):
return "error: {}".format(e)
@app.route("/books", methods=["POST"])
@jsonschema.validate("create_book")
def create_book():
book_name = request.json["title"]
return "[success] create book: {}".format(book_name)
if __name__ == "__main__":
app.run()
{
"create": {
"type": "object",
"properties": {
"title": {"type": "string", "maxLength": 50, "minLength": 10},
"author": {"type": "string", "maxLength": 30, "minLength": 1}
},
"required": ["title", "author"]
},
"update": {
"type": "object",
"properties": {
"title": {"type": "string", "maxLength": 50, "minLength": 10},
"author": {"type": "string", "maxLength": 30, "minLength": 1}
}
}
}
# hello_json.py
import os
from flask import Flask, request
from flask_jsonschema import JsonSchema, ValidationError
app = Flask(__name__)
app.config["JSONSCHEMA_DIR"] = os.path.join(app.root_path, "schemas")
jsonschema = JsonSchema(app)
@app.errorhandler(ValidationError)
def on_validation_error(e):
return "error: {}".format(e)
@app.route("/books", methods=["POST"])
@jsonschema.validate("books", "create") #
def create_book():
book_name = request.json["title"]
return "[success] create book: {}".format(book_name)
if __name__ == "__main__":
app.run()
$
git clone https://github.com/win911/flask_class.git$
git checkout 276c02
jsonschema
package to validate both request.form and request.json¶# hello_json.py
import os
from flask import Flask, request
from jsonschema import validate, ValidationError
app = Flask(__name__)
schema = {
"type": "object",
"properties": {
"title": {"type": "string", "maxLength": 50, "minLength": 10},
"author": {"type": "string", "maxLength": 30, "minLength": 1}
},
"required": ["title", "author"]
}
@app.errorhandler(ValidationError)
def on_validation_error(e):
return "error: {}".format(e)
@app.route("/books", methods=["POST"])
def create_book():
if request.form:
validate(request.form, schema)
book_name = request.form["title"]
elif request.json:
validate(request.json, schema)
book_name = request.json["title"]
else:
raise ValidationError("Invalid data format")
return "[success] create book: {}".format(book_name)
if __name__ == "__main__":
app.run()
$
git clone https://github.com/win911/flask_class.git$
git checkout 610782