前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【flask】JinJa2模版渲染及其他小记

【flask】JinJa2模版渲染及其他小记

作者头像
一朵灼灼华
发布2022-08-05 21:14:47
2440
发布2022-08-05 21:14:47
举报
文章被收录于专栏:一朵灼灼华的博客

最近在将本站升级为python语言,并使用flask进行实现,中途遇见的问题和一些方法的记录

token及密码校验

代码语言:javascript
复制
class user_info(db.Model):
    __tablename__ = 'user_info'
    username = db.Column(db.Integer, primary_key=True)
    password = db.Column(db.String(255), unique=False)
    role = db.Column(db.Integer, unique=False)
    name = db.Column(db.String(255), unique=False)

    def to_dict(self):
        '''将对象转换为字典数据'''
        reDict = {
            "username": self.username,
            "role": self.role,
            "name": self.name,
        }
        return reDict

    # 获取token,时长秒
    def generate_auth_token(self, expiration=3600 * 24):
        s = Serializer(app.config['SECRET_KEY'], expires_in=expiration)
        return s.dumps(self.username)

    # 通过token解析用户信息
    @staticmethod
    def verify_auth_token(token):
        s = Serializer(app.config['SECRET_KEY'])
        try:
            username = s.loads(token)
        except SignatureExpired:
            print('SignatureExpired', SignatureExpired)
            return None  # valid token, but expired
        except BadSignature:
            print('BadSignature', BadSignature)
            return None  # invalid token
        except Exception as e:
            print('Error: ', e)
            return None
        user = heanny_user_info.query.get(username)
        return user

    def hash_password(self, password):  # 加密
        self.password = pwd_context.encrypt(password)

    def verify_password(self, password):  # 解密
        return pwd_context.verify(password, self.password)

model外键

代码语言:javascript
复制
class h_posts(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), unique=False)
    content = db.Column(db.Text, unique=False)

    user = db.Column(db.String(255),db.ForeignKey(user_info.username), unique=False)
    author = db.relationship('user_info', backref=db.backref('h_posts'))

分页

代码语言:javascript
复制
    pagination = posts.query.order_by(desc('id')).paginate(page=int(page) if page else 1, per_page=15, error_out=False)
    blogs = list(map(lambda x: x.to_dict(), pagination.items))

blog.html

代码语言:javascript
复制
 <ul class="pagination flex-wrap">
                    {% if pagination.has_prev %}
                        <li class="page-item">
                            <a href="blog-1.html" class="page-link" data-ci-pagination-page="1"
                               rel="start"><i class="fa fa-angle-double-left"></i></a>
                        </li>
                        <li class="page-item ">
                            <a href="/blog-{{ pagination.prev_num }}.html" class="page-link"
                               data-ci-pagination-page="{{ pagination.prev_num }}" rel="prev">
                                <i class="fa fa-chevron-left"></i></a>
                        </li>
                    {% endif %}
                    {% for page in pagination.iter_pages(0,2,4,1) %}
                        {% if page %}
                            <li class="page-item {% if page==pagination.page %}active{% endif %}">
                                <a class="page-link" href="/blog-{{ page }}.html">{{ page }}</a>
                            </li>
                        {% else %}
                            <li class="page-item disabled"><a class="page-link" href="#">&hellip;</a></li>
                        {% endif %}
                    {% endfor %}

                    {% if pagination.has_next %}
                        <li class="page-item ">
                            <a href="/blog-{{ pagination.next_num }}.html" class="page-link"
                               data-ci-pagination-page="{{ pagination.next_num }}" rel="next"><i
                                    class="fa fa-chevron-right"></i></a>
                        </li>
                        <li class="page-item ">
                            <a href="/blog-{{ pagination.pages }}.html" class="page-link"
                               data-ci-pagination-page="pagination.pages"><i class="fa fa-angle-double-right"></i></a>
                        </li>
                    {% endif %}
                </ul>

模板渲染

Jinja2模版:

  1. 让页面逻辑独立于业务逻辑,开发的程序易于维护
  2. 提供流程控制,继承等高级功能使得模版非常灵活,快速,安全
强大模版

模版支持任何基于文本的格式(HTML/XML/CSV/LaTex等等),并没有特定的扩展名

基础语法:

说明: 模版中支持字符串,数值,列表,元组,字典, boolean(true/false,注意是小写的),除此之外还支持全局函数/内置过滤器|/内置测试器is/in关键字/if关键字/字符连接符~

  1. 支持算术运算符,+,-,/,//,%,,*,
  2. 支持比较运算符,==,!=,>,>=,<,<=
  3. 支持逻辑运算符,and,or,not,(expr)
  4. 支持其它运算符,in,is,|,~(连接字符串使用{{ ‘hello ‘ ~ name ~ ‘!’ }},如果name是limanman则返回hello limanman!),()调用可调用量,./[]获取对象属性
变量相关

模版中支持with语句,和PY内置with类似,with后面常跟表达式,主要用于限制对象的作用域

过滤器
模版继承

Jinja2最强大的部分就是模版继承,模版继承允许你构建一个包含你站点公共元素的基本模版’骨架’,并定义子模版可以覆盖的块

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • token及密码校验
  • model外键
  • 分页
  • 模板渲染
    • 强大模版
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档