引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互,今天教大家实现后台登录功能,比较简单。

本节知识:表单标签,表单验证,数据查询,模板

python环境:python2.7,flask,以及flask相关的库(没有列完,如果运行manage.py时提示未安装的库安装就ok了。)

上节已经把admin(后台用户表)表建好了,再看看模型吧。

-----models.py

class Admin(db.Model):
__tablename__ = 'admin'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
password = db.Column(db.String(128))
###权限 admin=1 1>2>3
power = db.Column(db.Integer)
set_time = db.Column(db.DateTime)
set_user = db.Column(db.Integer)
email = db.Column(db.String(128))
phone = db.Column(db.String(128))
'''
def __init__(self, username=None, password=None, power=None,phone=phone):
self.username = username
self.password = password
self.power = power
self.phone = phone
'''
def __repr__(self):
return '<User %r>' % self.username,
def check_user(self,username,password):
obj = self.query.filter_by(username=username,password=password).first()
return obj
def check_user_aru(self,username):
obj = self.query.filter_by(username=username).first()
return obj def get_auser(self):
obj = db.session.execute('select b.* ,a.username as set_user_name from admin as a ,admin as b where a.id =b.set_user ').fetchall()
return obj

上面大部分是admin表的字段定义内容,下面的函数是我以后会用到的函数。

虽然字段有点多,不过我们只需要用到username和password就行了,确定了表单字段,接下来就要生成login页面。

-----先在视图文件定义  views.py   这不是完整版,因为还需要定义表单类,下面的LoginForm 还未写出来。

@main.route('/admin/login', methods=['GET', 'POST'])
def Alogin():
form = LoginForm()
if request.method=='POST':
if form.validate_on_submit():
username = form.username.data
password = form.password.data
####查询数据
try:
obj = Admin.check_user(Admin(),username, password)
if obj:
session['username'] = username
session['userid'] = obj.id
###记入adminlog
session['login_time'] = int(time.time())
login_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
ip = get_ip()
log_list = AdminLog(username=username,userid=obj.id,login_time=login_time,ip=ip,email=obj.email, phone=obj.phone,power=obj.power,loginout_time='')
db.session.add(log_list)
db.session.commit()
log_id = log_list.id
session['log_id'] = log_id
return redirect('/admin/') except:
return render_template('admin/login.html',form=form,errors_info=u'用户名或密码错误!!') else:
return render_template('admin/login.html',form=form,error=form.errors)
else:
if session.has_key('username'):
return redirect('/admin/')
return render_template('admin/login.html',form=form)

上述代码已经写出大概逻辑了,接下来是login.html以及_formhelpers1.html的内容

-----login.html   只看表单部分就好了

{% from "_formhelpers.html" import render_field %}
<form id="loginform" class="form-vertical" action="/admin/login" method="post">
{{ form.hidden_tag() }}
<div class="control-group normal_text"> <h3><img src="{{url_for('static', filename='images/admin/logo.png')}}" alt="Logo" /></h3></div>
<div class="control-group">
<div class="controls">
<div class="main_input_box">
<span class="add-on bg_lg"><i class="icon-user"></i></span>{{ render_field(form.username) }}
</div>
</div>
</div>
<div class="control-group">
<div class="controls">
<div class="main_input_box">
<span class="add-on bg_ly"><i class="icon-lock"></i></span>{{ render_field(form.password) }}
</div>
</div>
</div> {% if errors_info %} <span style="margin-left:26px; color:red">{{ errors_info }}</span>{% endif %} <div class="form-actions">
<span class="pull-left"><a href="#" class="flip-link btn btn-info" id="to-recover">Lost password?</a></span>
<span class="pull-right"><input type="submit" class="btn btn-success" value="Login"/> </span>
</div>
</form>

从_formhelpers1.html引入字段,赋值到form标签里面,这里需要注意_formhelpers1.html放置的路径,对应就ok了。

------_formhelpers1.html

{% macro render_field(field) %}
{{ field(**kwargs)|safe }}
{% if field.errors %}
{% for error in field.errors %}
<span for="required" generated="true" class="help-inline">{{ error }}</span>
{% endfor %}
{% endif %}
{% endmacro %}

该文件的内容就是定义的表单标签,以及输出错误的信息(error)。

接下来上完整版views.py  加上LoginForm

class LoginForm(FlaskForm):
username = StringField('Username', validators=[Length(min=3, max=25,message=u'请输入3-25个字符!')],render_kw={"placeholder": "username",})
password = PasswordField('Password',validators= [
Length(min=3, max=25,message=u'请输入4-25个字符!')],
render_kw={"placeholder": "password",}
) class AuserForm(FlaskForm):
username = StringField('username',validators=[Length(min=3, max=25,message=u'请输入3-25个字符!')],)
password = PasswordField('password',validators= [
Length(min=3, max=25,message=u'请输入4-25个字符!')],
)
repassword = PasswordField('repassword',validators= [
Length(min=3, max=25,message=u'请输入4-25个字符!')],
)
email = StringField('email', validators=[Length(min=3, max=25,message=u'请输入3-25个字符!')],)
phone = StringField('phone', validators=[Length(min=3, max=25,message=u'请输入3-25个字符!')],)
power = SelectField('power',choices=[(2,u'管理账户'),(3,u'普通账户')],coerce=int) @main.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html') @main.route('/admin/login', methods=['GET', 'POST'])
def Alogin():
form = LoginForm()
if request.method=='POST':
if form.validate_on_submit():
username = form.username.data
password = form.password.data
####查询数据
try:
obj = Admin.check_user(Admin(),username, password)
if obj:
session['username'] = username
session['userid'] = obj.id
###记入adminlog
session['login_time'] = int(time.time())
login_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
ip = get_ip()
log_list = AdminLog(username=username,userid=obj.id,login_time=login_time,ip=ip,email=obj.email, phone=obj.phone,power=obj.power,loginout_time='')
db.session.add(log_list)
db.session.commit()
log_id = log_list.id
session['log_id'] = log_id
return redirect('/admin/') except:
return render_template('admin/login.html',form=form,errors_info=u'用户名或密码错误!!') else:
return render_template('admin/login.html',form=form,error=form.errors)
else:
if session.has_key('username'):
return redirect('/admin/')
return render_template('admin/login.html',form=form)

认真看下class LoinForm 怎么定义字段的照葫芦画瓢就ok了。

----------------------这是分割线----------------------------

没有报错的话现在打开页面是ok的

----先测试下,表单字段的验证有没有问题

当我直接点击登录,没有填写字段名,肯定是通不过验证的

符合class LoginForm 设置的错误信息,验证还有很多方式,网上查阅下资料即可。

----------接下来我们来看看views.py 登录的逻辑,基本大功告成了

@main.route('/admin/login', methods=['GET', 'POST'])##定义可以请求的方式
def Alogin():
form = LoginForm()##实例登录类,传到页面
if request.method=='POST': ##提交方式
if form.validate_on_submit(): ##可以通过验证
username = form.username.data ##获取表单数据
password = form.password.data
####查询数据
try:
obj = Admin.check_user(Admin(),username, password) ##开始查询
if obj:
session['username'] = username
session['userid'] = obj.id
###记入adminlog
session['login_time'] = int(time.time())
login_time=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
ip = get_ip()
log_list = AdminLog(username=username,userid=obj.id,login_time=login_time,ip=ip,email=obj.email, phone=obj.phone,power=obj.power,loginout_time='')
db.session.add(log_list)
db.session.commit()
log_id = log_list.id
session['log_id'] = log_id
return redirect('/admin/') except:
return render_template('admin/login.html',form=form,errors_info=u'用户名或密码错误!!') ##传入自己设置的error信息 else:
return render_template('admin/login.html',form=form,error=form.errors)
else:
if session.has_key('username'): ##登录时需要判断用户是否已经登陆了,当然还有其他,别入不同的ip继续登录,就要把他挤下去等
return redirect('/admin/')
return render_template('admin/login.html',form=form)

里面的check_user函数,正式models.py里面定义的

当然不定义在这里也可以,后期还需要规整,关于数据库的操作还有有些些麻烦,搞得我每次都想用原生sql来搞了,网上资料也总是对不上我的点,忧伤。

下次根据后台的功能,再分享下增删改查的操作,大家一起学习。

暂时没有把项目上传到github上面,以后我再传。

flask-日料网站搭建-后台登录的更多相关文章

  1. flask-日料网站搭建

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互. 本节知识:搭建web目录,目前正在copy网站. python环境:python2.7,fla ...

  2. flask-日料网站搭建-数据库操作

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互,目前已经copy完主页,不是前端太慢太慢. 本节知识:数据库的操作,模型建表,更新数据库. py ...

  3. flask-日料网站搭建-ajax传值+返回json字符串

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互,今天教大家实现ajax操作,返回json. 本节知识:jquery,json,ajax pyth ...

  4. 如何使用laravel搭建后台登录系统

    今天想用laravel搭建一个后台系统,就需要最简单的那种,有用户登录系统,试用了下,觉得laravel的用户登录这块做的还真happy.当然,前提就是,你要的用户管理系统是最简单的那种,就是没有用户 ...

  5. python web框架Flask——后台登录

    项目搭建 创建一个项目之后,需要在手动创建几个包(含有__init__.py文件的目录)和文件 1.在主目录下创建配置文件:config.py 2.在主目录下创建扩展文件:exts.py 3.在主目录 ...

  6. 转载-30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)

    原文:30分钟搞定后台登录界面(103个后台PSD源文件.素材网站)   目录 一.界面预览 二.PSD源文件预览 三.工具分享 四.资源说明 五.素材下载网站 六.下载 去年八月时要做一个OA系统为 ...

  7. 27、Flask实战第27天:cms后台登录

    cms后台登录界面 后台登录页面,我们不用自己写,只需要去Bootstrap中文网去找一个模板改一下就行 这里使用的模板是:https://v3.bootcss.com/examples/signin ...

  8. Laravel5.1 搭建博客 --后台登录

    今天咱来实现后台的登录. 首先我们的后台需要三个控制器: PostController:管理文章. TagController:管理文章标签. UploadController:上传文件. 当我们访问 ...

  9. springMVC+angular+bootstrap+mysql的简易购物网站搭建

    springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...

随机推荐

  1. 如何使用百度bae部署web项目

    百度bae提供了支持各种开发环境的的应用引擎,包括node.js.php.java等,而且还免费提供了一定容量的mysql.mongodb.redis等数据库,所以,可以把它当作一个云服务器来使用.而 ...

  2. gulp 压缩 js 和 css 代码

    我们在写出来的代码都是非常规范的,改换行的时候就换行,改tab 的时候就有tab,还有这样做是为了后期维护方便,但是这也导致了内存占用量的增大,当把把代码发到线上,如果网速慢一点,可能很久都加载不出来 ...

  3. Jmeter实现接口自动化测试

    一.环境准备 1.Jdk1.7或以上: 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  4. mysql常用函数总结

    一.数学函数 abs(x) 返回x的绝对值 bin(x) 返回x的二进制(oct返回八进制,hex返回十六进制) ceiling(x) / ceil(x) 返回不小于x的最小整数值 floor(x)  ...

  5. 推荐四款 Bug 管理系统,最适合你的才是最好的!

    转载自:https://www.jianshu.com/p/e7d3121eaaec   在这个移动互联网的时代,每天都会涌入大量新的 App,想要留住你的用户,必须时刻保持产品创新与系统的稳定.对于 ...

  6. 本地开发spark代码上传spark集群服务并运行

    打包 :右击.export.Java .jar File 把TestSpark.jar包上传到spark集群服务器的 spark_home下的myApp下: 提交spark任务: cd /usr/lo ...

  7. Spring Cloud(Dalston.SR5)--Feign 与 Hystrix 断路器整合

    创建项目 要使 Feign 与 Hystrix 进行整合,我们需要增加 Feign 和 Hystrix 的依赖,修改 POM.xml 中增加以下依赖项如下: <?xmlversion=" ...

  8. 转 Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

    今早刚上班.客户打电话过来说系统访问不了,输入用户名.用户号不能加载出来!听到这个问题,第一时间想到的是不是服务器重新启动了,Oracle数据库的相关服务没有启动的原因.查看服务的时候,发现相关的服务 ...

  9. git 克隆指定分支

    git clone -b v2.8.1 https://git.oschina.net/oschina/android-app.git

  10. VS2010与Qt5.1.0集成(非源码方式)

    早就听说qt可以集成到VS中,就是一直没尝试过.一直在使用qt creator,也没觉得它有什么不好.可最近VS用多了,我发现一个qt creator中很不好的毛病,就是代码自动完成时,creator ...