@app.route('/')
def index():
result=render_template('index.html',name='三',age=20)
<body>
欢迎{
{
name}}--{
{
age}} #变量占位符
利用模板引擎进行 jinjia2 转换 render-template封装了改引擎
dict1 = {
'name': '文浦', 'age': 20, 'phone': '18866668888'}
friends = ['沈腾', '小沈阳', '蔡徐坤', '周琦']
girl = None
result = render_template('index.html', user=dict1, friends=friends, girl=girl)
姓名:{
{
user.name}},年龄:{
{
user.age}},手机号码:{
{
user.phone}}
<br>
朋友们:{
{
friends[1]}},{
{
friends[0]}},{
{
friends[2],friends[3]}}
模板语句中的循环
class girlFriend:
def __init__(self,name):
self.name=name
self.gender='女'
def __str__(self):
return self.name
girl=girlFriend('小菜菜')
{
{
girl}}---{
{
girl.gender}}
<!--对象的属性获取也是可以通过:对象名.属性名-->
<!--代码块 -->
{
% if girl %}
{
{
girl}}--{
{
girl.gender}}
{
%else%}
{
{
name}}还没有心仪的女生!
{
% endif %}
{
% for friend in friends %}
<tr>
<td>{
{
friend.name}}</td>
<td>{
{
friend.gender}}</td>
<td><a href="">删除</a>
<a href="">更新</a>
</td>
</tr>
{
% endfor %}
template 模板
1.变量: { {变量名}}
2.控制块: {% if %} …{%else%}…{%endif%}
{% for 变量 in 集合 %} … {% endfor %}
3.过滤器
@app.route('/filter')
def use_filter():
return render_template('index2.html', message='this is a message')
{
{
message|default('no message')|capitalize}} #能获取到然后开头大写,过滤方法是字符串的方法
{
{
'%s have %d apples'|format('Linda',5)}} #format用法
{
{
msg|safe}} <h1>MESSAGE</h1> safe会关闭忽略转义
{
% autoescape false %} #关闭转义
{
{
msg}}
<br>
{
{
msg1}}
{
% endautoescape %}
{#
模板注释:字符串过滤 default(默认值) title capitalize lower upper reverse tri去除空格 format safe *
数值:abs round—>round(2,‘floor’) 向下截取数值保留2小数
列表:first last length sort sum join(’-’)
#}
{
% set users=[{
'a':100,'b':2},{
'a':11,'b':22},{
'a':111,'b':222}] %}
{
% for user in users|sort(attribute='a',reverse=True) %}
<p>{
{
user}}</p>
{
% endfor %}
{
% for user in users %}
{
% for key,value in user.items() %}
<p>{
{
key}}--{
{
value}}</p>
{
% endfor %}
<hr>
{
% endfor %}
{
% extends 'base.html' %}
base.html
{
% block content%} #预留一个坑
AAAAA
{
% endblock %}
index3.html
{
% block content %} #继承后填坑
<article ...>
{
% endblock %}
{% block 名字 %}
{% endblock %}
步骤:
定义模板base.html 父模板
存放的是一些公共的标签(显示)
在模板里面我们会定义:
子模板中继承父模板:
清空子模板
{% extends ‘base.html’ %}
填充对应的block
{% block title %} 关于 {% endblock %}
{% block myjs %}
{% endblock %}
补充:
模板加载静态资源:
app.url_map ----> 此属性可以查看路由和视图函数(endpoint)之间的映射关系
循环中的loop
goods = ['可乐', '雪碧', '酸奶', '北冰洋', '芬达']
@app.route('/goods')
def show_goods():
return render_template('index4.html', goods=goods)
{
% for good in goods %}
<tr>
<td>{
{
loop.index}}</td>
<td>{
{
good}}</td>
</tr>
<% endfor %}
宏:类似函数
@app.route('/macro')
def show_marco():
return render_template('index5.html',goods=goods)
macro.html
{
% macro input(name,id,type='text') %}
<input type="{
{type}}" id="{
{id}}" name="{
{name}}">
{
% endmacro %}
{
% macro show_data(datas,clazz='a1') %}
<ul class="{
{clazz}}">
{
% for data in datas %}
<li> {
{
data}} </li>
{
% endfor %}
</ul>
{
% endmacro %}
index5.html #引用宏文件
{
% import 'macro.html' as ma %}
<div>
{
{
ma.input('username','username')}}
</div>
<div>
{
{
ma.input('password','password',type='password')}}
</div>
宏:类似python中函数,只不过在模板中定义宏就是定义函数,调用宏(函数)
步骤:
定义:macro.html
{% macro 函数名(参数,…) %}
使用各种模板语法 for if … + html标签
{% endmacro %}
使用宏:
{% import ‘macro.html’ as 别名 %}
调用:
{ { 别名.宏名字(参数) }}
apps:__init__.py
from flask import Flask
from apps.views import index_bp
from apps.views.ent_view import ent_bp
from settings import DevelopmentConfig
from apps.views.blog_view import blog_bp
from apps.views.house_view import house_bp
def create_app():
app = Flask(__name__,template_folder='../templates')
# 加载配置
app.config.from_object(DevelopmentConfig)
# 注册蓝图
app.register_blueprint(index_bp)
app.register_blueprint(blog_bp)
app.register_blueprint(house_bp, url_prefix='/house')
app.register_blueprint(ent_bp, url_prefix='/ent')
return app
views:__init__.py
from flask import Blueprint, render_template
index_bp = Blueprint('index', __name__)
@index_bp.route('/')
def index():
return render_template('index.html')
蓝图:Blueprint
步骤:
blog_model.py
from datetime import datetime
class Blog:
def __init__(self, title, content, author):
self.title = title
self.content = content
self.author = author
self.datetime = datetime.now()
self.click_num = 0
def __str__(self):
return self.title
def add_click(self):
self.click_num += 1
blog_view.py
from datetime import datetime
from flask import Blueprint, render_template, request, redirect, url_for
from apps.models.blog_model import Blog
blog_bp = Blueprint('blog', __name__, url_prefix='/blog')
blogs = []
@blog_bp.route('/', endpoint='index')
def blog_index():
# blog = Blog('简书一年,我找到了一份好工作', '这是我的亲身经历,没有虚构,虽然它听起来不像真的。 2017年11月7日 星期二 晴 说起来很惭愧,在简书写了一年的文,至今,我还是原来的我,既...', '陌上红裙')
# blogs.append(blog)
return render_template('blog/index.html', blogs=blogs)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>博客首页</title>
<style>
.box{
width:50%;
padding:20px 10px;
border-bottom:1px dashed gray;
}
.box p{
font-size:12px;
color:gray;
}
</style>
</head>
<body>
{
% if blogs %}
{
% for blog in blogs %}
<div class="box">
<h3>{
{
blog.title}}</h3>
<p>{
{
blog.content}}</p> #段落标签
<p> 作者:<span>{
{
blog.author}}</span>
发布时间:<span>{
{
blog.datetime}}</span>
阅读量: <span>{
{
blog.click_num}}</span>
<a href="{
{url_for('blog.delete',id=loop.index0)}}">删除</a>
<a href="{
{url_for('blog.delete',id=loop.index0)}}">更新</a>
</p>
</div>
{
% endfor %}
<a href="{
{url_for('blog.add')}}">发表新文章</a>
{
% else %}
还没有任何的博客文章,赶快点击<a href="{
{url_for('blog.add')}}">发表</a>吧!
{
% endif %}
</body>
</html>
添加博客
@blog_bp.route('/add', endpoint='add', methods=['GET', 'POST'])
def blog_add():
if request.method == 'POST':
title = request.form.get('title')
author = request.form.get('author')
content = request.form.get('content')
print(title)
# 创建blog对象
blog = Blog(title, content, author)
# 添加blog中
blogs.append(blog)
url = url_for('blog.index')
print(url, type(url))
return redirect(url)
return render_template('blog/add_blog.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加博客</title>
</head>
<body>
<form action="{
{url_for('blog.add')}}" method="post">
<p><input type="text" name="title" placeholder="文章标题"></p>
<p><input type="text" name="author" placeholder="作者名"></p>
<p>
<textarea name="content" cols="50" rows="10" placeholder="文章内容">
</textarea>
</p>
<p><input type="submit" value="发表文章"></p>
</form>
</body>
</html>
删除博客
@blog_bp.route('/delete/' ,endpoint='delete')
def blog_delete(id):
value = blogs.pop(id)
if value:
return redirect(url_for('blog.index'))
<a href="{
{url_for('blog.delete',id=loop.index0)}}">删除</a>