python开发一个自己的技术网站_Python+Flask+MysqL的web建设技术开发一个网站

一、摘要

flask是一个很精简,灵活的框架,对于web的开发非常的好,具有jinja2强大的模板引擎的支持。flask框架的一个扩展就是sqlalchemy,

sqlalcheny是flask的一个扩展。sqlalcheny是一个强大的关系型数据库框架,它是一个框架,并不是数据库。sqlalcheny数据库的操作得益于我们的ORM技术,将繁琐的数据库操作转化为我们的python的类,其实还是转化为sql语句来操作数据库,这就是他的强大的地方,同时特提供了数据库原生的SQL底存功能。sqlalcheny提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能。

二、系统概要说明

1、设计数据库,数据库设计是网站设计的重点,需要对网站需求进行分析,设计适合网站需求的数据库。

2、注册页面,设计网站需要用户的使用,注册则是重要的一部分,用户注册需要对用户信息的管理,因此,需要数据库的连接,进行用户注册的验证。

3、登录功能,在用户注册了账号后,拥有了该网站的使用权,则可以进行登录,而登录也需要数据库的验证。

4、用户发布问答,该网站是新闻信息发布平台,用户可以将身边的见闻发布到网站,此功能也需要数据库的连接,将用户发表的问答存到数据库的question表中,以用户唯一的id号作为外键。

5、用户发布新闻问答后则会跳到网站首页,首页是展示该网站的所以新闻信息,以发布的最新日期排序进行展示,用户可根据兴趣点击查看网站的新闻标题,进入新闻的详情页面,了解新闻的具体信息。

6、新闻详情页中具有评论及推荐文章功能,用户可对新闻进行评论发表还可对文章进行点赞及收藏,此操作过程存入数据库的comment表中,以用户id、新闻id作为外键;网站还根据用户感兴趣的新闻推荐相应类型的新闻文章。

7、个人中心页面,网站根据用户的活跃度,呈现用户发布的新闻,评论文章,收藏文章以及点赞。

8、用户个人信息更改页面,数据库中存储了用户注册时的信息,当用户要更改个人信息时,可进入用户更改信息页面对个人信息进行修改,信息修改完成保存后则会重新写入用户user表中,更新用户个人信息。

9、网站具有模糊搜索功能,当用户查找相应信息是,可根据用户输入的信息进行模糊搜索,提高用户的体验度。

10、密码保护功能,用户注册时设置的密码存储到数据库中,此时数据会将用户的密码进行加密,提高用户使用的安全性。

三、网站结构设计

1、父模板模块

2、首页、发布列表显示

3、注册页面

4、登录页面

5、发布新闻页面

6、新闻详细页,点赞,收藏,评论,推荐文章

7、更改个人信息页面

8、个人 信息页面

四、模块详细设计

1、首页模块

@app.route('/')defindex():if request.args.get('info'):

info= request.args.get('info')else:

info=None;

context={'questions': Question.query.order_by('-creat_time').all(),'cf': Cf.query.all(),'info': info,'hot': Question.query.order_by('-click').all()[0:5]

}return render_template('index.html', **context)

2、注册模块

@app.route('/regist/', methods=['GET', 'POST'])defregist():if request.method == 'GET':#打开注册页的模板

return render_template('regist.html')else: #收到用户上传的信息

username = request.form.get('username')

password= request.form.get('password')

user= User.query.filter(User.username ==username).first()ifuser:return 'error:user exitst'

else:

user= User(username=username, password=password)

db.session.add(user)#加入数据库

db.session.commit()return redirect(url_for('login'))

3、登录模块

@app.route('/login/', methods=['GET', 'POST'])deflogin():if request.method == 'GET':return render_template('login.html')else:

username= request.form.get('username')

password= request.form.get('password')

user= User.query.filter(User.username ==username).first()ifuser:ifuser.check_password(password):

session['username'] =user.username

session['user_id'] =user.id

session.permanent=True#重新定位到首页

return redirect(url_for('index'))else:#重新定位到注册

return redirect(url_for('login'))else:return redirect(url_for('login'))

4、发布模块

@app.route('/question', methods=['GET', 'POST'])

@loginFirstdefquestion():if request.method == 'GET':

cf=Cf.query.all()return render_template('question.html', cf=cf)else:

title= request.form.get('title')

detail= request.form.get('detail')

author_id= request.form.get('author_id')

cf= request.form.get('cf')

question= Question(title=title, detail=detail, author_id=author_id, cf=cf)

db.session.add(question)#加入数据库

db.session.commit()return redirect(url_for('index'))

5、评论模块

@app.route('/answer/', methods=['GET', 'POST'])defanswer():if request.method == 'POST':

question_id= request.form.get('question_id')

author_id= request.form.get('author_id')

detail= request.form.get('detail')

comment= Comment(question_id=question_id, author_id=author_id, detail=detail)

db.session.add(comment)

db.session.commit()return redirect(url_for('detail', question_id=question_id))

@app.route('/commentaries/')

def commentaries(user_id):

userCommentaries = Comment.query.filter(Comment.answer_id == user_id).all()

num = len(userCommentaries)

id = session.get('user_id')

if id:

user = User.query.filter(User.id == id).first()

else:

user = {}

return render_template('commentaries.html', userCommentaries=userCommentaries, user=user, num=num)

6、更改个人信息模块

@app.route('/uploadLogo/', methods=['GET', 'POST'])defuploadLogo(user_id):

user= User.query.filter(User.id ==user_id).first()

f= request.files['logo']

basepath= os.path.dirname(__file__) #当前文件所在路径

upload_path = os.path.join(basepath, 'static/uploads', f.filename) #注意:没有的文件夹一定要先创建,不然会提示没有该路径

f.save(upload_path)

user.icon= 'uploads/' +f.filename

db.session.commit()return redirect(url_for('setPassword', id=user_id));

@app.route('/setPassword/', methods=['GET', 'POST'])

@loginFirstdefsetPassword(id):if request.method == 'GET':return render_template('setPassword.html')else:

user= User.query.filter(User.id ==id).first()ifuser:if user.check_password(request.form.get('old')):

user.password= request.form.get('new1')

db.session.commit()

info= '修改成功'

else:

info= '原密码错误'

else:

info= '未知错误'

return redirect(url_for('index', info=info))

7、个人信息模块

@app.route('/comment//')defcomment(user_id, num):

user= User.query.filter(User.id ==user_id).first()

content={'comment': user.comment,'questions': user.question,'user2': user,

}if (num == '1'):return render_template('subComment1.html', **content, title='全部问题')elif (num == '2'):return render_template('subComment2.html', **content)elif (num == '3'):return render_template('subComment3.html', **content)elif (num == '4'):

content={'comment': user.comment,'questions': user.collection.all(),'user2': user,

}return render_template('subComment1.html', **content, title='我的收藏')else:return render_template('subComment1.html', **content)

@app.route('/c/')defc(cf):

content={'questions': Question.query.filter(Question.cf == cf).order_by('-creat_time').all(),'cf': Cf.query.all(),'hot': Question.query.order_by('-click').all()[0:5]

}return render_template('index.html', **content)

8、模糊搜索模块

@app.route('/search')defsearch():

qu= request.args.get('q')

c= '' if request.args.get('c') == '' else request.args.get('c')

y= '' if request.args.get('y') == '' else request.args.get('y')

query=Question.query.filter(

or_(

Question.title.contains(qu),

Question.detail.contains(qu),

),

Question.cf.like('%' + c + '%'),

Question.creat_time.like('%' + y + '%'),

).order_by('-creat_time').all()

context={'questions': query,'cf': Cf.query.all(),'hot': Question.query.order_by('-click').all()[0:5]

}return render_template('index.html', **context)

9、详情页面

@app.route('/detail/', methods=['GET', 'POST'])

@loginFirstdefdetail(question_id):

quest= Question.query.filter(Question.id ==question_id).first()

u= User.query.filter(User.id == session.get('user_id')).first()if request.method == 'POST':if request.form.get('click') == '1':

quest.click= quest.click + 1

if request.form.get('collection') == '1':

user=u

user.collection.append(quest)

db.session.add(user)

col= u.collection.filter_by(id=question_id).first()if col isNone:

col={}

comment= Comment.query.filter(Comment.question_id == question_id).order_by('-creat_time').all()

quest.look= quest.look + 1content={'ques': quest,'comment': comment,'col': col,'questions': Question.query.filter(Question.cf ==quest.cf).all(),

}return render_template('detail.html', **content)

五、数据库设计

Collection =db.Table('collection',

db.Column('id', db.Integer, primary_key=True, autoincrement=True),

db.Column('book_id', db.Integer, db.ForeignKey('question.id')), #评论对应的文章的id

db.Column('collection', db.Integer, db.ForeignKey('user.id')), #收藏用户的id

db.Column('createdate', db.DATETIME) #发布时间

)classUser(db.Model):__tablename__ = 'user'

#建立一个表user

id = db.Column(db.Integer, primary_key=True, autoincrement=True)

username= db.Column(db.String(20), nullable=False)

_password= db.Column(db.String(200), nullable=False)

say= db.Column(db.String(50))

icon= db.Column(db.String(50))

collection= db.relationship('Question', secondary=Collection, backref=db.backref('user', lazy='dynamic'),

lazy='dynamic')

@propertydefpassword(self):returnself._password

@password.setterdefpassword(self, row_password):

self._password=generate_password_hash(row_password)defcheck_password(self, row_password):returncheck_password_hash(self._password, row_password)classComment(db.Model):__tablename__ = 'comment'id= db.Column(db.Integer, primary_key=True, autoincrement=True)

author_id= db.Column(db.Integer, db.ForeignKey('user.id'))

question_id= db.Column(db.Integer, db.ForeignKey('question.id'))

creat_time= db.Column(db.DateTime, default=datetime.now())

detail= db.Column(db.TEXT, nullable=False)

question= db.relationship('Question', backref=db.backref('comment'))

author= db.relationship('User', backref=db.backref('comment', order_by=creat_time.desc))classQuestion(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'))

cf= db.Column(db.Integer, db.ForeignKey('cf.id'))

look=db.Column(db.Integer)

click=db.Column(db.Integer)

author= db.relationship('User', backref=db.backref('question'))

cfClass= db.relationship('Cf', backref=db.backref('question'))#分类

classCf(db.Model):__tablname__ = 'cf'id= db.Column(db.Integer, primary_key=True, autoincrement=True) #数据库唯识别id

name = db.Column(db.String(30)) #文章名称

context = db.Column(db.TEXT) #分类内容

1、分类表

2、收藏表

3、评论表

4、发布新闻表

5、用户表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值