最近在将本站升级为python语言,并使用flask进行实现,中途遇见的问题和一些方法的记录
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)
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'))
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
<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="#">…</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模版:
模版支持任何基于文本的格式(HTML/XML/CSV/LaTex等等),并没有特定的扩展名
说明: 模版中支持字符串,数值,列表,元组,字典, boolean(true/false,注意是小写的),除此之外还支持全局函数/内置过滤器|/内置测试器is/in关键字/if关键字/字符连接符~
模版中支持with语句,和PY内置with类似,with后面常跟表达式,主要用于限制对象的作用域
模版继承
Jinja2最强大的部分就是模版继承,模版继承允许你构建一个包含你站点公共元素的基本模版’骨架’,并定义子模版可以覆盖的块