发布功能完成。

  • 编写要求登录的装饰器

from functools import wraps

def loginFirst(func): #参数是函数

@wraps(func)

      def wrapper(*args, ** kwargs): #定义个函数将其返回

          #要求登录

          return func(*args, ** kwargs)

      return wrapper #返回一个函数

  • 应用装饰器,要求在发布前进行登录,登录后可发布。
@app.route('/question/',methods=['GET','POST'])
@loginFirst
def question():

 

  • 建立发布内容的对象关系映射。
class Question(db.Model):
  • 完成发布函数。

保存到数据库。

重定向到首页。

from flask import Flask,render_template,request,redirect,url_for,session
from flask_sqlalchemy import SQLAlchemy
from functools import wraps
import config
from datetime import datetimeapp = Flask(__name__)
app.config.from_object(config)db=SQLAlchemy(app)
class User(db.Model):__tablename__ = 'User'id = db.Column(db.Integer,primary_key=True,autoincrement=True)username = db.Column(db.String(20),nullable=False)password = db.Column(db.String(20), nullable=False)nickname = db.Column(db.String(20))class User(db.Model):__tablename__ = 'user'id = db.Column(db.Integer, primary_key=True, autoincrement=True)username = db.Column(db.String(20), nullable=False)password = db.Column(db.String(20), nullable=False)nickname = db.Column(db.String(20))class Question(db.Model):__tablename__='question'id = db.Column(db.Integer, primary_key=True, autoincrement=True)title =db.Column(db.String(100), nullable=False)detail = db.Column(db.Text, nullable=False)creat_time=db.Column(db.DateTime,default=datetime.now)author_id = db.Column(db.Integer,db.ForeignKey('user.id'))author=db.relationship('User',backref=db.backref('question'))
db.create_all()
# user=User(username='mis1234',password='111111')
# db.session.add(user)
# db.session.commit()
@app.route('/')
def base():return render_template("base.html")@app.route('/login/', methods=['GET', 'POST'])
def login():if request.method == 'GET':return render_template("denglu.html")else:username = request.form.get('username')password = request.form.get('password')user = User.query.filter(User.username == username).first()if user:if user.password == password:session['user']=usernamesession.permanent=Truereturn redirect(url_for('base'))else:return '密码错误'else:return '用户名不存在'@app.context_processor
def mycontext():usern = session.get('username')if usern:return {'username':usern}else:return {}@app.route('/regist/', methods=['GET', 'POST'])
def zhuce():if request.method == 'GET':return render_template("zhuce.html")else:username = request.form.get('username')password = request.form.get('password')nickname = request.form.get('nickname')user = User.query.filter(User.username == username).first()if user:return '用户名已存在'else:user = User(username=username, password=password, nickname=nickname)db.session.add(user)  # 数据库,添加操作
            db.session.commit()return redirect(url_for('login'))
@app.route('/logout/')
def logout():session.clear()return redirect(url_for('base'))def loginFirst(func):@wraps(func)def wrapper(*args,**kwargs):if session.get('user'):return func(*args,**kwargs)else:return redirect(url_for('login'))return wrapper@app.route('/fabu/',methods=['GET','POST'])
@loginFirst
def fabu():if request.method=='GET':return render_template('question.html')else:title=request.form.get('title')detail=request.form.get('detail')author_id=User.query.filter(User.username==session.get('user')).first().idquestion=Question(title=title,detail=detail,author_id=author_id)db.session.add(question)  # 数据库,添加操作
        db.session.commit()return redirect(url_for('base'))def fabu():return  render_template('question.html')if __name__=='__main__':app.run(debug=True)
{% extends 'base.html' %}{% block title %}问答{% endblock %}
{% block head %}<meta charset="UTF-8"><link type="text/css" rel="stylesheet" href="../static/css/question.css">{% endblock %}{% block main %}<form action="{{ url_for('fabu') }}" method="post"><div class="label"><h1 style="color:pink",align="center"> 发布问答</h1><div class="q"><label for="question">问题</label><textarea id="question" cols="50" rows="1"></textarea></div><div class="form-group"><label for="questionDetail">详情</label><textarea class="form-control" id="questionDetail" cols="50" rows="5"></textarea><br><input type="checkbox" name="c1" id="c1" value="">记住我<br></div><br><div class="input-area"><button οnclick="fnQuestion">发布问答</button></div></div></form>
{% endblock %}

 

转载于:https://www.cnblogs.com/hxl316/p/7908812.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git clone报错

问题&#xff1a;error: RPC failed; curl 18 transfer closed with outstanding read data remaining 方法&#xff1a;&#xff08;一般http方式会用到&#xff09; $ git clone 仓库地址 --depth 1 $ cd 项目目录 $ git fetch --unshallow 附带&#xff1a;指定分支命令 …

《自然》《科学》相继发文批评质疑:俄罗斯注册新冠疫苗“让众人面临风险”...

来源&#xff1a;环球科学编译丨杨心舟8月11日&#xff0c;俄罗斯总统普京在与政府成员举行会议时透露&#xff0c;俄罗斯已经注册世界第一种新冠肺炎疫苗。普京表示&#xff0c;这款疫苗非常有效&#xff0c;能够形成稳定的免疫力并且已通过所有的检查&#xff0c;并且自己的女…

翻译连载 | 附录 A:Transducing(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

原文地址&#xff1a;Functional-Light-JS原文作者&#xff1a;Kyle Simpson&#xff0d;《You-Dont-Know-JS》作者关于译者&#xff1a;这是一个流淌着沪江血液的纯粹工程&#xff1a;认真&#xff0c;是 HTML 最坚实的梁柱&#xff1b;分享&#xff0c;是 CSS 里最闪耀的一瞥…

python 去除不可见字符\x00

读取出来的字节&#xff1a;testa b‘testa\x00’ 去掉\x00&#xff1a;testa.decode().strip(b\x00.decode()) 经测试多个\x00也可以去掉

思未尽,行致远丨记 IBM 成立 109周年

来源&#xff1a;IBM中国主创团队&#xff08;IBM Social & Studio DL team&#xff09;策划&#xff1a;点亮 IBM 庆生蜡烛的甜心御姐 June撰稿&#xff1a;被百年“名场面”感动 cry 的原创一哥 Raphal设计&#xff1a;熬出黑眼圈也要操刀设计的鲁先森排版&#xff1a;话…

RAC(ReactiveCocoa)使用方法(二)

RAC(ReactiveCocoa)使用方法(一)RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用法&#xff0c;这篇文章主要总结日常开发中结合一些UI控件的用法。 RAC给常见的很多UI类拓展了用法&#xff0c;使得开发变得越来越简…

unordered_map使用自定义enum作为键值

首先定义模板作为unordered_map的第三个参数&#xff1a; struct EnumClassHash {template <typename T>std::size_t operator()(T t) const{return static_cast<std::size_t>(t);} }; 使用&#xff1a; enum class MyEnum {};std::unordered_map<MyEnum, i…

王恩哥院士:信息化发展进程中,科学、基础研究和技术、应用都是关键

图为王恩哥院士接受新华网采访来源&#xff1a;新华网由深圳市人民政府指导&#xff0c;中国信息化百人会主办&#xff0c;华为技术有限公司协办的中国信息化百人会2020年峰会于8月7日启幕。会上&#xff0c;中国信息化百人会顾问、中国科学院院士、北京大学原校长、中国科学院…

数据传址赋值问题

例如&#xff1a; int a 0&#xff1b; void test (&a) { for (int i 0; i < 10; I) { *a; } } 并不能拿到想要的值&#xff0c;反而可能都是随机值&#xff0c;最好使用*a 1。因为*a是先a后*取值&#xff0c;导致指针位置变化&#xff0c;值并没有变。

js 时间格式化

/*** 获取本周、本季度、本月、上月的开始日期、结束日期*/var now new Date(); //当前日期 var nowDayOfWeek now.getDay(); //今天本周的第几天 var nowDay now.getDate(); //当前日 var nowMonth now.getMonth(); //当前月 var nowYear now.getYear(); //当前年 n…

英特尔的六大新技术

来源&#xff1a;芯东西&#xff08;公众号&#xff1a;aichip001&#xff09; 芯东西8月14日消息&#xff0c;昨日晚间&#xff0c;英特尔在2020年架构日上推出10nm SuperFin晶体管技术&#xff0c;将实现其有史以来最强大的单节点内性能增强。据悉&#xff0c;10nm SuperFin技…

c++查找pair,使用map,unordered_map,vector

map和unordered_map都可以简单的实现&#xff0c;因为本身就是键值对&#xff0c;而且都提供find方法&#xff0c;相对来说unordered_map比map略快。 vector使用find_if函数&#xff0c;并且最简单的用法就是c 特性中的lambda&#xff0c;例如&#xff1a; static vector<…

判断jQuery选择器结果为空 - CSDN博客

判断jQuery选择器结果为空 - CSDN博客 原文:判断jQuery选择器结果为空 - CSDN博客jQuery选择器获取到的是一个对象&#xff0c;所以无论页面上存在或者不存在元素&#xff0c;这个对象都不为空。因此&#xff0c;如果要使用jQuery检查元素再给某个页面上是否存在的时候&#xf…

中国芯片设计云技术白皮书2.0发布

来源&#xff1a;摩尔精英作为行业内专业的IT/CAD技术服务团队&#xff0c;摩尔精英IT/CAD事业部曾于2019年11月21日的南京ICCAD大会上发表的《芯片设计云计算白皮书1.0》中&#xff0c;初步探索了基于公有云的EDA计算平台的实现方案。随着进一步的探索和方案优化&#xff0c;我…

c++中unordered_map的坑

unordered_map本身有hash表&#xff0c;不排序的情况下&#xff0c;对需要键值对的数据处理是比较方便的&#xff0c;存储、查找都很快了&#xff0c;但是如果不注意键值类型的话&#xff0c;有可能会掉坑的。 比如&#xff1a; unordered_map<string, vector<BigTestS…

课后作业-阅读任务-阅读笔记4

1.程序的质量体现在软件外在功能的质量 2.软件开发过程有三个主要的特性&#xff1a;好&#xff0c;快&#xff0c;便宜 3.CMMI有两种不同的实施方法&#xff0c;其级表示不同的内容&#xff1a; &#xff08;1&#xff09;连续式&#xff1a;主要是衡量一个企业在某一项目中的…

c#使用Path.Combine的一个坑

本想先解一个目录&#xff0c;再重组一个新目录存结果文件&#xff0c;想到用Path.Combine可以方便快捷&#xff0c;结果就遇见了坑&#xff0c; windows目录下有驱动器符号如“d:”&#xff0c;这时候使用Path.Combine并不会组成想要的路径&#xff1a; 理想状态下Path.Comb…

希尔伯特著名的第六问题 – 原来麦克斯韦早就有解?

转自&#xff1a;知社学术圈作者&#xff1a;Natalie Wolchover 编译&#xff1a;子聿希尔伯特的第六大问题号召人们公理化物理学定律&#xff0c;也就是说从一套初始假设或者公理的基础出发严格构建它们。这样做将会揭示需要不同公设的定律之间的矛盾。从相同的公理出发推导…

c++ tinyxml2 解析xml小坑

如题&#xff0c;项目中遇到的解析xml小坑&#xff1a; xml是python在windows下生成的&#xff0c;虽然是utf8的&#xff0c;但是回车是16进制显示的0D 0A&#xff0c;与linux下的回车不同&#xff08;0A&#xff09;&#xff0c;导致使用Parse函数时解析失败&#xff0c;查找…

96. Unique Binary Search Trees1和2

/*这道题的关键是&#xff1a;动态表尽量的选取&#xff0c;知道二叉搜索树中左子树的点都比根节点小&#xff0c;右子树的点都比根节点大所以当i为根节点&#xff0c;左子树有i-1个点&#xff0c;右子树有n-i个点&#xff0c;左右子树就可以开始递归构建&#xff0c;过程和一开…