首先博客有注册登录功能(有吗,我不知道,不重要,反正还没写管理员逻辑)
那么就像上次一样建立就好了,具体在上一篇里面。
https://blog.csdn.net/weixin_43775150/article/details/90273168
然后就是发文功能了,暂时还没有学富文本编辑器,所以用些简陋的,一个文件上传(传图片用的,虽然也可以传别的),一个标题框,一个正文框
先做标题和正文
html:
<form action="/add_arc" enctype="multipart/form-data" method="post">
<input type = "hidden" name = "csrf_token" value = "{{ csrf_token() }}">
<p>标题:</p><input type="text" name="title" style="width: 1001px;height: 20px;font-size: large"><br><br>
<input type="file" name="file"><br><br>
<textarea type="text" name="text"style="width: 1000px; height: 300px"></textarea><br>
<input type="submit" value="提交">
{% for messags in get_flashed_messages() %}
{% if messags == '标题和内容均不能为空' %}
<span style="color: red">{{ messags }}</span>
{% endif %}
{% endfor %}
</form>
emmm,乱七八糟的,反正扔到pycharm里面运行一下就看得出是个啥了(预览的时候记得把大括号和大括号内容都删掉)
然后是头秃的后端:
# 建立文章路径模型
class Artic(db.Model):
__tablename__ = 'artics'
id = db.Column(db.Integer, primary_key=True)
path = db.Column(db.String(128), unique=True)
pics = db.relationship('Pic', backref='arctic')
#建立图片路径模型
class Pic(db.Model):
__tablename__ = 'pics'
id = db.Column(db.Integer, primary_key=True)
path = db.Column(db.String(128), unique=True)
act_id = db.Column(db.Integer, db.ForeignKey('artics.id'))
来说加入标题和正文的:
# flag标记是否标题文字都有
flag = False
@app.route("/add_arc", methods=['POST'])
def startadd():
global flag
title = request.form.get('title')#获取标题框的文字
text = request.form.get('text')#获取正文框的文字
pic = request.files['file']#获取文件 这个是后面关于文件才要管的,现在暂时不看
addtext(title, text)#调用将标题和正文上传的函数
if flag:#判断是否标题和正文都有 这个flag会在addtext函数里面进行更改
flag = False#将flag重置为false
addpic(pic)#标题正文都有,就进行图片的上传操作 这里暂时也先不看
return redirect(url_for('show_page'))#重定向 这个部分我们待会再看
@app.route("/add_text", methods=['POST', 'GET'])
def addtext(title, text):
global flag
t = [n for n in Artic.query.all()]
t = len(t)# 这两句将t置为数据库末尾的id
suf = str(t+1) +'.txt' # 以数据库已有数据末尾id+1的值为文件名 数据库为空则为0。后缀为.txt
if title and text: # 标题和正文同时不为空
path = os.path.join(os.path.dirname(__file__), 'artic', suf)
#这句话分三部分
#os.path.join将括号内用逗号分隔的内容整合成路径
#os.path.dirname(__file__)返回当前py文件所在的目录
#artic是我建的文件夹,在↑返回的目录下,suf是刚刚的文件名
with open(path, 'w') as f:
f.write(title)#写入标题
f.write("\n")
f.write(text)#写入内容
arctic = Artic(path=path)#一通数据库操作
db.session.add(arctic)
db.session.commit()
flag = True#将flag置为真,以进行图片的上传
else:
flash(u'标题和内容均不能为空')
flag = False
return redirect(url_for('show_page'))
OK文字部分解决了,来搞图片部分
这里暂时不对图片类型进行检测了,因为我其实希望还能上传点别的。
@app.route("/add_pic", methods=['POST', 'GET'])
def addpic(pic):
t = [n for n in Artic.query.all()]
t = len(t)#类比文字部分,是一样的思路
if pic == '':#如果为空
return redirect(url_for('show_page'))#重定向回去
if pic:#这句冗余了,不过因为在写博客,所以还是不删了,就当记录错误了
#但这句没有冗余啊,这句必需的,思路同样类比文字部分
path = os.path.join(os.path.dirname(__file__), 'static/pic', str(t+1)+ '.' +pic.filename.rsplit('.', 1)[-1])
pic.save(path)#将图片对象保存到刚刚的 path 下
p = Pic(path=path, act_id=int(t+1))# 一通数据库操作,第二个参数可以删掉
db.session.add(p)
db.session.commit()
return redirect(url_for('show_page'))
图片和文字都上传完了 ,接下来就是显示了!!!
@app.route('/')
def show_page():
pt = [t.path for t in Artic.query.all()]#建立文章路径列表
j = 1 #记录读到第几个了 为了后面的图片操作
titles = []
texts = ['']
pics = []
ffflags = []
for i in pt: #循环访问文件
with open(i) as f:
titles.append(f.readline())#读入标题
for char in f.read():
texts[j-1] += char#逐个字符方式读入文件内容
texts.append('')
a = Artic.query.get(j)# a定向到数据库中当前文章那一行
j += 1 #下一个文件
if a.pics:# 如果不为空
for k in a.pics: #循环访问图片 虽然可以单独访问图片,但我本意是一文多图,所以写的有点烦
pics.append('')
pics[-1] = '/static/pic/' + k.path.rsplit('\\')[-1]
# 将图片路径加入图片路径列表
print(pics[-1])
#这里为了更改css样式而准备的
ffflags.append('block')
else:
# 图片不存在 路径置为None
# css样式置为none
pics.append(None)
ffflags.append('none')
print(titles, texts, pics)
return render_template("index.html", all=zip(titles, texts, pics, ffflags))
OK写完了,写的很乱,但是相信之后完善了会很舒服。