Fask中的路由-模版-静态文件引用 及宏定义与表单
文档:
flask:
http://docs.jinkan.org/docs/flask/quickstart.html#redirects-and-errors
jinja2
http://docs.jinkan.org/docs/jinja2/
flask-script:
http://flask-script.readthedocs.io/en/latest/
flask-sqlalchemy:
http://www.pythondoc.com/flask-sqlalchemy/quickstart.html
一:基本内容
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/index/')
def index():
return render_template('index.html',title='<h1>这是第一个测试</h1>')
@app.route('/about/')
def about():
return render_template('about.html',data='about页面')
if __name__ == '__main__':
app.run(debug=True)
app = Flask(name) 生成一个Flask的实例
app.route('/') 指定路由名称
render_template('index.html',title='
这是第一个测试
') 向html返回一个服务器端回发的内容
对于html页面端:
{{ title|safe }} 输出title的值,并且标记为安全类型
<a href="{{ url_for('about') }}">about页面</a> 使用url_for 逆向生成路由地址,about为方法名称
引用静态文件:
<link rel="stylesheet" href="{{url_for('static',filename="")}}">
示例:
<link rel="stylesheet" href="{{ url_for('static',filename='css/main.css') }}"/>
二:路由
动态路由:
@app.route('/user/<int:use_id>/')
def user1(use_id):
return "userid %d"%use_id
路由的三种形式:
@app.route('/user/')
@app.route('/user/<username>')
@app.route('/user/<int:use_id>/')
四:参数的获取:
POST:
username=request.form.get('username')
password=request.form.get('password')
GET:
tag=request.args.get('tags')
五:cookies的设置:
@app.route('/setcookies/')
def setCookies():
if request.method=='GET':
response= make_response(render_template('userlogin.html'))
response.set_cookie('username','hello')
return response
六:读取cookies:
@app.route('/getCookies/')
def getCookies():
if request.method=='GET':
cookies=request.cookies.get('username')
print(cookies)
return Response('ok')
七:设置出错页面:
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'),404
八:使用scripts插件:
版本: Flask-Script==2.0.6
pip install Flask-Script==2.0.6
使用Manager替换app
from flask.ext.script import Manager
app = Flask(__name__)
managerinstance=Manager(app)
app.route('/test/')
def test():
pass
if __name__ == '__main__':
managerinstance.run()
启动应用 :
python flaskDemo.py runserver
九:模版:
官方文档:
http://jinja.pocoo.org/docs/2.10/templates/#variables
取值{{}}
语句块{%%}:
{%for item in data%}
{%endfor%}
过滤器:
{{data|safe}}
赋值:
{% set links=[
{'label':'Home','href':url_for('index')},
{'label':'Home','href':url_for('index')},
] %}
上述语句即为变量links赋值
在页面中显示变量的值为{{links}}
限制模版中变量的作用域
将变量放置在with语句块中,变量将只在当前的作用范围内生效,如下所示:
{% with %}
{% set links=[
{'label':'Home','href':url_for('index')},
{'label':'Home','href':url_for('index')},
] %}
{% endwith %}
此时如果在with块外部调用该变量,将无法显示该变量的值
如果要在页面上生成以上相应的菜单标签,可以按以下代码操作,在循环中依次取出对应的值
<nav>
{% for link in links %}
<a href="{{ link.href }}">{{ link.label }}</a>
{% endfor %}
</nav>
菜单生成的改进版:
{% set links_1=[
('Home',url_for('index')),
('about',url_for('about')),
] %}
<nav>
{% for label,link in links_1 %}
{% if not loop.first %}|{% endif %}
<a href="{{ link }}">{{ label }}</a>
{% endfor %}
</nav>
模版继承:
1:创建block块进行占位
{%block head%}{%endblock%}
{%block content%}{%endblock%}
block为关键字
head content为占位名称,名称可随意,但不可重复
2:页面继承
{%extends 'base.html'%}
3:在模版中对部分内容的重复调用:
@app.route('/test/')
def testExtTemplate():
return render_template('templatePages.html',data='测试测试',title='测试一下')
{% extends '_layout.html' %}
{% block title %}
{{ title }}
{% endblock %}
{% block content %}
<p>
{{ self.title() }}
</p>
{% endblock %}
在以上代码即实现,对title的重复调用
在conent中如果要重新显示title的值时,可以使用{{self.title()}},在这里tile是调用方法,如果是调用title的话将会返回一下地址
如果在页面的模版页面中需要在显示上级模板的基础上显示自定义的内容,如:
在_layout.html模版文件中有以下定义:
{% block foot %}
这是尾部
{% endblock %}
在子页面中重写了该部分内容,该部分内容将被覆盖,如子页面代码如下所示:
{% block foot %}
<hr>
{% endblock %}
如果,此时仅仅是想添加一些内容,并且保留父级内容,可按如下代码所示:
{% block foot %}
<hr>
{{ super() }}
{% endblock %}
以上代码将添加一个水平线后同时调用父级内容
包含其它页面:
如果需要在当前页面包含进来其它的页面可以使用如下语法:
{% include 'index.html' %}
页面中内容的重用:
如果对于页面中的内容,如表单标签或其它内容进行重用可以按以下方式进行宏定义
如,需要对一批的input标签进行重用的时候,而不希望去重复的写input标签,可以按以下方式来操作
宏定义:
{% macro input(name,value='',type='text',size=20)%}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}
调用:
username: {{ input("username") }}
password:{{ input(name="username",type="password") }}
如果定义了大量的宏,可以把宏定义放到一统一的文件中,如
新建立一个macro.html,将以上代码复制到该文件中,如下所示:
{% macro input(name,value='',type='text',size=20)%}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}
在需要使用宏的html文件中,将该宏文件导入
{% import 'macro.html' as ui %}
同时对于调用代码改变为以下代码
username: {{ ui.input("username") }}
password:{{ ui.input(name="username",type="password") }}
十:在flask中使用bootstrap插件
1:安装 flask-bootstrap
pip install flask-bootstrap
2:页面继承:
{% extends 'bootstrap/base.html' %}
对于flask-bootstrap安装后,在源码的template目录的bootstrap文件夹中中将生成几个html文件分别为:
base.html
fixes.html
google.html
pagination.html
utils.html
wtf.html
将主要使用以上几个html文件作为flask项目中的模板页面
使用案例:
在py文件中:
from flask_bootstrap import Bootstrap
Bootstrap(app)
如果不在py文件中导入并实例化,那么在页面中继承bootstrap的页面时将直接报错
{% extends 'bootstrap/base.html' %}
<html>
<head>
<title>Title</title>
</head>
<body>
{% block content %}
{% set links_1=[
('Home',url_for('index')),
('about',url_for('about')),
] %}
<div class="navbar navbar-inverse ">
<nav class="nav">
{% for label,link in links_1 %}
{% if not loop.first %}|{% endif %}
<a href="{{ link }}">{{ label }}</a>
{% endfor %}
</nav>
</div>
{% endblock %}
</body>
</html>
十一:对于生成导航菜单可以使用另外一个插件:flask-nav
安装flask-nav
pip3 install flask-nav
在py文件中导入:
from flask_nav import Nav
from flask_nav.elements import *
nav=Nav()
nav.register_element('top',Navbar('flask入门',
View('主页','index'),
View('关于','about')
))
nav.init_app(app)
在html文件中:
{% extends 'bootstrap/base.html' %}
{% block navbar %}
{{ nav.top.render() }} top为定义的名称
{% endblock %}
十二:表单
安装 :pip install flask-wtf
提供的所有的字段类型:
__all__ = (
'BooleanField',
'DecimalField',
'DateField',
'DateTimeField',
'FieldList',
'FloatField',
'FormField',
'IntegerField',
'RadioField',
'SelectField',
'SelectMultipleField',
'StringField',
)
表单的范例:
表单类:loginForm.py
from flask.ext.wtf import Form
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired
class Login_form(Form):
username=StringField(label='用户名',validators=[DataRequired()])
password=PasswordField(label='密码',validators=[DataRequired()])
submit=SubmitField(label='提交')
函数:
@app.route('/login/')
def login():
from loginForm import Login_form
form=Login_form()
return render_template('loginpage.html',form=form)
html文件:
<form method="post">
{{ form.username.label }}
{{ form.username() }}
{{ form.password.label }}
{{ form.password() }}
{{ form.submit() }}
</form>
以上代码会建立一个基础的表单,但是当访问login时会出现csrf的跨站请求伪造的错误,所以需要定义一个公钥并使用
如下所示,建立一个文件用于存放公钥,如config.py
SECRET_KEY='wo shi yi ge baobao a '
在代码代码中使用以上定义的公钥:
app.config.from_pyfile('config.py')
验证器支持的类型:
__all__ = (
'DataRequired', 'data_required', 'Email', 'email', 'EqualTo', 'equal_to',
'IPAddress', 'ip_address', 'InputRequired', 'input_required', 'Length',
'length', 'NumberRange', 'number_range', 'Optional', 'optional',
'Required', 'required', 'Regexp', 'regexp', 'URL', 'url', 'AnyOf',
'any_of', 'NoneOf', 'none_of', 'MacAddress', 'mac_address', 'UUID'
)
自动生成表单并应用 bootstrap样式:
{% extends 'bootstrap/base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block content %}
<div style="width: 300px;" class="container">
{{ wtf.quick_form(form) }}
</div>
{% endblock %}
对于需要展现的一些消息,可以按如下方法展现:
from flask import Flask,render_template,request,redirect,\
make_response,abort,Response,flash
@app.route('/login/')
def login():
from loginForm import Login_form
form=Login_form()
flash('欢迎登录系统') 在此写入消息
return render_template('loginpage.html',form=form)
在flask中导入flash模块
在html页面:
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
flask开发遇到 Must provide secret_key to use csrf解决办法
开发flask的时候,遇到了 Must provide secret_key to use csrf错误提醒。原来是没有设置secret_key 。在代码中加上
app.config['SECRET_KEY']='xxx'
SECRET_KEY最好不要写在代码中。
最好设置一个config.py文件,从中读取该内容
config.py
CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
app.py
app.config.from_object('config')
这样就可以防止csrf了
Fask中的路由-模版-静态文件引用 及宏定义与表单的更多相关文章
- Django中静态文件引用优化
静态文件引用优化 在html文件中是用django的静态文件路径时,一般会这么写: <script type="text/javascript" src="/sta ...
- Django模板变量,过滤器和静态文件引用
模版路径查找 首先去settings.py里面找TEMPLATES ,在TEMPLATES下面找DIRS,找到就返回,没找到就继续往下,如果APP_DIRS设置为为Ture,那么就会到上面 INSTA ...
- Django模板变量及静态文件引用
一.模板变量传递 1.视图向模板传递变量 视图中的列表,数组,字典,函数均可以传递给模板 在视图中定义变量通过render(content{‘name’ : value})传递给模板 模板通过{{ ...
- Django-2- 模板路径查找,模板变量,模板过滤器,静态文件引用
模板路径查找 路径配置 2. templates模板查找有两种方式 2.1 - 在APP目录下创建templates文件夹,在文件夹下创建模板 2.2 - 在项目根目录下创建templates文件夹, ...
- js文件上传原理(form表单 ,FormData + XHR2 + FileReader + canvas)
目录 form表单上传 FormData + XHR2 + FileReader + canvas 无刷新本地预览压缩上传实例 目前实现上传的方式 浏览器小于等于IE9(低版本浏览器)使用下面的方式实 ...
- django模版中配置和使用静态文件方法
1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...
- (三)、Express 路由、静态文件、
一.路由 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET.POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问. 每一个路由都可以有一个或者多个 ...
- 当Django中Debug=False,静态文件处理方式。
Django设置DEBUG为False时,'django.contrib.staticfiles'会关闭,即Django不会自动搜索静态文件,静态文件不能加载导致的问题有两个: 1.页面排版不正常,即 ...
- Django--static静态文件引用
需求 引用静态文件的目录不写死 "django.core.context_processors.static", html引用 1 <script src="{{ ...
随机推荐
- python--生成器,生成器推导式, yield from
一.生成器 生成器的本质就是迭代器,它一个一个的创建对象. 在python中有三种方式获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的类型转换也可以获取生成器 二.生成 ...
- 基于openresty配置https访问
安装方法:http://openresty.org/cn/linux-packages.html 1. openssl的版本信息 [root@localhost conf]# openssl vers ...
- (一)Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- 1. Socket网络编程
1. 借助服务器实现小写转大写的程序: 客户端:发送任意小写字母到服务器端. 服务器端:接收小写字母,转为大写,回传给客户端,然后客户端显示到屏幕. #include <stdio.h> ...
- git配置教程
一.配置ssh 1.检查本机是否有ssh key设置 如果没有则提示: No such file or directory 如果有则进入~/.ssh路径下(ls查看当前路径文件,rm删除所有文件) 2 ...
- Visual Studio性能计数器,负载测试结果分析- Part III
对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...
- ElasticSearch 系列随笔
1.ElasticSearch 常用设置 2.ElasticSearch 从2.2升级到6.2.4碰到的问题 3.ElasticSearch 因为磁盘空间不够引起的数据插入错误.(message [C ...
- shell-012:批量创建用户
# #!/bin/bash # 批量创建用户 # 分析:用命令给用户创建密码的方法有两种 # . 可以直接用echo的方法 # echo "abc-123" |passwd roo ...
- 【NOI2018】
总之国赛已经过了1个月了. 感谢北大当初给我的一本约救我狗命,不然国赛就要没学上了. 铜牌倒数十多名,我觉得我也是混到了一种境界. 虽然对于集训队已经失去梦想,但是,Day1全场堪称最低的21分,也是 ...
- github访问慢加速访问
实测从1kb到了1m多 方法: 登录 https://www.ipaddress.com/ 输入github.com得到一个或两个IP地址 输入github.global.ssl.fastly.net ...