python-flask(二)

模板-Template

@app.route('/')
def index():
	result=render_template('index.html',name='三',age=20)

<body>
	欢迎{
     {
     name}}--{
     {
     age}} #变量占位符
	利用模板引擎进行 jinjia2 转换 render-template封装了改引擎

python-flask(二)_第1张图片
变量占位符中变量可以是字典,列表

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 %}
步骤:

  1. 定义模板base.html 父模板
    存放的是一些公共的标签(显示)
    在模板里面我们会定义:

    1. {% block 名字 %}
      默认
      {% endblock %}
    2. {% block myjs %} {% endblock %}
      {% block mycss %} {% endblock %}
      注意:定义block的位置跟最后填充的位置一致
  2. 子模板中继承父模板:
    清空子模板
    {% 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中函数,只不过在模板中定义宏就是定义函数,调用宏(函数)
步骤:

  1. 定义:macro.html

    {% macro 函数名(参数,…) %}
    使用各种模板语法 for if … + html标签
    {% endmacro %}

  2. 使用宏:
    {% import ‘macro.html’ as 别名 %}
    调用:
    { { 别名.宏名字(参数) }}


### 蓝图:blueprint 存储操作方式的容器![在这里插入图片描述](https://img-blog.csdnimg.cn/20200621223916730.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NodW5qaWFueGFpb3NoaQ==,size_16,color_FFFFFF,t_70)
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
步骤:

  1. apps文件中存放各个应用的view
  2. 在每个app的view中定义蓝图:
    xx_bp = Blueprint(‘蓝图名字’,name)
  3. 使用蓝图注册路由:(将路由和视图函数绑定)
    @xx_bp.route(’/’,endpoint=‘xx’)
    def index():
    return ‘首页’
  4. 注册蓝图到app上
    app.register_blueprint(蓝图对象,url_prefix=‘url前缀’)

简易博客

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> &nbsp; &nbsp; &nbsp;
        发布时间:<span>{
     {
     blog.datetime}}</span>&nbsp; &nbsp; &nbsp;
        阅读量: <span>{
     {
     blog.click_num}}</span>
        &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp;
        <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>

你可能感兴趣的:(flask,python,flask)