FLASK做一个简陋的小博客(一文一图或一文0图)

首先博客有注册登录功能(有吗,我不知道,不重要,反正还没写管理员逻辑)

那么就像上次一样建立就好了,具体在上一篇里面。

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写完了,写的很乱,但是相信之后完善了会很舒服。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值