flask_sqlalchemy
数据库的数据类型分为:String(有长度限制的字符串), Text(较长的unicode文本) , Integer, DateTime, Float, Boolean, PickleType(存储为一个持久化的 Python 对象),LargeBinary(任意大的二进制数据)。
对于其中的
Datetime
,属性字段的设置,如果是获取自动获取当前的时间,默认的参数只有utc标准时间,如果要变成北京时间,需要自己对db.Column()
函数内的default
字段的入口函数进行修改如下from datetime import datetime def time(): from pytz import time btime=time.zone('Asia/Shanghai') #没有北京时区 就用上海吧差不多 time=datetime.now(btime) return time Time=db.Column(db.Datetime,index=True,default=time) #如果是使用使用UTC标准时间的话参数: default=Datetime.now('UTC')
继续将上次的博客模块吧,设置Flask基本的框架都差不多掌握了,想建立一个博客,页面设计真心麻烦,Bootstrap虽然后基本的控件,但是页面还是有布局,颜色方面的配置,才能好看(又要开始学html各种标签的布局功能,真心麻烦),感觉要真正做好还有好长一段路要走。找到一个特别中意的模板
欲思模板
,缺少基于PHP,TAT 真正做好一件事还要好长的轮要走。不说了,继续讲代码,布置好登陆登出认证以后,下一步需要设计网页Blog的评论。对于文章,评论需要建立数据库保存。首先建立数据库模型Models.py
from appconfig import loginmanage,db from flask_login import UserMixin from datetime import datetime from markdown import markdown def time_now(): from pytz import timezone UTC = timezone('Asia/Shanghai') return datetime.now(UTC) class Post(db.Model): __tablename__='posts' id = db.Column(db.Integer, primary_key=True) title=db.Column(db.String) body=db.Column(db.Text) body_html=db.Column(db.Text) time=db.Column(db.DateTime,index=True,default=time_now ) comments=db.relationship('Comment',backref='post') #Post与Comment建立联系,Post中建立comments字段,Comment建立, #post字段 # author_id=db.Column(db.Integer,db.ForeignKey('users.id')) @staticmethod def bodyhtml(target, value,oldvalue,initiator): target.body_html = markdown(value) #有些数据库不支持事件,sqlalchemy自己就可以建立数据库监听事件来支持 #利用静态函数,在数据库修改之前,运行静态方法,将md文本转化为html,保存在 #该存储对象的body_html字段之中 db.event.listen(Post.body,'set',Post.bodyhtml) class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) body = db.Column(db.String) created = db.Column(db.DateTime, index=True, default=time_now) post_id = db.Column(db.Integer, db.ForeignKey('posts.id')) author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
识图函数view.py
from article import article as app from flask import make_response,render_template from werkzeug.utils import secure_filename from flask import request, redirect, url_for from article.forms import PostForms,CommentForm from article.models import Post,Comment from flask.ext.login import login_required,current_user from appconfig import db import os @app.route('/') def index(): s=render_template('index.html',title='hello sunqi',body='**Hello Sunqi**') response = make_response(s) response.set_cookie('name', 'theusername') return response @app.route('/Service') def Service(): return 'service' @app.route('/about') def about(): return 'about' @app.route('/user/<regex("[a-z]{3}"):username>') # 路由匹配 def user(username): return username #上传函数 @app.route('/upload', methods=['GET', "POST"]) def upload(): if request.method == "POST": f = request.files['file'] if f.filename != '': basepath = os.path.abspath(os.path.dirname(__file__)) uploadpath = os.path.join(basepath, '') f.save(uploadpath + secure_filename(f.filename)) post=Post(title='sunqi',body='********') db.session.add(post) db.session.commit() return redirect(url_for('article.upload')) return render_template('upload.html') #获取post列表,可以进行评论,评论存入数据库 #功能初步阶段,还需要进行修改,例如还需要返回评论内容等等 @app.route('/post/<int:id>',methods=['POST','GET']) def post(id): #获取post页相亲 post=Post.query.get_or_404(id) # # #评论列表 form=CommentForm() if form.validate_on_submit(): comment=Comment(body=form.body.data,post=post) db.session.add(comment) db.session.commit() return render_template('details.html',title=post.title, form=form,post=post) #多个地址指向同一个路由函数,且要求用户已经登录 #实现的功能是修改或者提交article ,并且将数据存入Post数据库 @app.route('/edit') @app.route('/edit/<int:id>') @login_required def edit(id=0): post=None form=PostForms() if id==0: #新添加 post=Post(author_id=current_user.id) #这个地方需要注意,很奇怪的是有例子使用author=current_user.........py2.7可以成功,我的py3报错,兼容性差这么远? else: id!=0 #修改 post=Post.query.get_or_404(id) if form.validate_on_submit(): post.body=form.body.data post.title=form.title.data db.session.add(post) db.session.commit() mode='新添加' if id>0: mode='编辑' return render_template('post/edit.html', title='%s-%s'%(mode,post.title), form=form,post=post)
蓝图文件 包名:aritcle
init.py(下斜杆md貌似写不出来)
from flask import Blueprint article=Blueprint('article',__name__) from . import view,forms #注意一定是这个位置,避免loop import错误
在使用flask_login模块前,必须设置一个装饰器,用于获取当前用户的实例,好多例子中对return 中user_id,是int(user_id),实际上发现好像并没有什么区别程序还是一样效果,可以对比官方文档就是use_id…….
@loginmanage.user_loader def load_user(user_id): return User.query.get(user_id)