您的位置:首页 > 编程语言 > Python开发

从零开始学Python-day8

2016-12-23 12:37 381 查看
Python-day8

学习要有定位,明确目标地去学习。希望自己能坚持下去,并有所收获---leaves(ps:开发的核心思想就是对数据的增、删、改、查)

python07 -- python+mysql,前段html实现数据的更新,删除

一、浏览器请求数据的方法
浏览器请求数据的方法有GET、POST、PUT、DELETE、HEADER五种方法,其中python中常用的方法位GET和POST两种方法。GET与POST方法的具体区别如下。
GET,常用获取数据,默认为读,浏览器访问都是GET,前段GET请求,逻辑端通过request.args.get获取指定参数的值[request.args可以获取所有参数];
POST,常用于提交表单数据,写数据,浏览器默认不支持直接的POST方式,一般通过变动设置,逻辑端路由中添加methods=["GET","POST"]和前端html中form标签内添加action='/路径'来实现。

##GET方法
url :/login?username=cc&userpwd=222
#获取某一单一的参数值
request.args.get("username",None)    ===>cc
#获取所有参数值(获取数据结构类似字典)
request.args ===》ImmutableMultiDict([('username', u'cc'), ('userpwd', u'222')])

##POST方法
#主要提交表单数据

#获取提交的某一个单一数值
request.form.get("name",None)  ====> aaa

#获取提交的所有参数的值(获取数据结构类似字典)
request.form                   =====>ImmutableMultiDict([('password', u'aaa'), ('name', u'aaa')])


二、实现html前端POST方式提交表单数据
POST方法提交表单数据主要分两步实现:

1.逻辑端路由监听时添加post方法




2.前端html的form标签中添加action='/路径',此路径要与逻辑端监听路由一一致。




##具体实现post方法的代码
1.flask逻辑端代码
from flask import Flask,request,render_template,redirect

app = Flask(__name__)

@app.route('/')
def index():
return redirect('/login')

@app.route('/login',methods=["GET",'POST'])
def login():
if request.method == "POST":
print request.method
print request.form.get("name",None)
print request.form
tmp_post = dict(request.form)
print dict( (k,v[0]) for k ,v in tmp_post.items())
return render_template('login.html')

if __name__ == "__main__":
app.run(host='0.0.0.0',port=888,debug = True)

2.前端html代码
<html>
<form action='/login' method="POST">
<p>name<input type='text' name='name'></p>
<p>password<input type='password' name='password'></p>
<p> <input type="submit" value='login'></p>
</form>
</html>


2.2 POST(GET)方法获取全部数据后的转换
request模块中method方法可以获取使用的访问方法。如 request.method 值可以为GET或者POST

2.2.1 POST方法获取的数据为

在此不讨论request.form.get("name",None)这种某个单一元素的数据转换。
request.form获取的数据为ImmutableMultiDict([('password', u'aaa'), ('name', u'aaa')]),为类字典格式使用dict转换下可以变成字典转换后的值类型为{'password': [u'dddd'], 'name': [u'aaa']},不过此时字典value值为元组。所以离我们真正想要的字典形式有点差距,可以使用字典生成式转换下。

2.2.2 具体的转换方法

request.form ====> ImmutableMultiDict([('password', u'dddd'), ('name', u'aaa')])
tmp_post = dict(request.form) ===> {'password': [u'dddd'], 'name': [u'aaa']}
dict( (k,v[0]) for k ,v in tmp_post.items()) ===> {'password': u'dddd', 'name': u'aaa'}

2.3 zip()函数
In [5]: help(zip)
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

##使用zip生成字典
In [7]: zip(('name','age'),('Bob',14))
Out[7]: [('name', 'Bob'), ('age', 14)]

In [8]: dict(zip(('name','age'),('Bob',14)))
Out[8]: {'age': 14, 'name': 'Bob'}

In [9]: dict(zip(('name','age','test'),('Bob',14,'job')))
Out[9]: {'age': 14, 'name': 'Bob', 'test': 'job'}

In [10]: dict(zip(('name','age','test'),('Bob',14)))
Out[10]: {'age': 14, 'name': 'Bob'}

In [11]: dict(zip(('name','age'),('Bob',14,'job')))
Out[11]: {'age': 14, 'name': 'Bob'}

In [12]:


三、flask+mysql+html贯通实现更新和删除操作

3.1 更新、删除的逻辑端以及前端html代码
##flask逻辑端代码
[root@test blog]# cat demo.py
#!/usr/bin/python
#coding:utf-8

from flask import Flask ,render_template,redirect,request
import MySQLdb as mysql
from datetime import datetime

datas = mysql.connect(user='root',passwd='123456',db='reboot',charset='utf8')
datas.autocommit(True)
cur = datas.cursor()

fields = ["id","name","name_cn","password","email","mobile","role","status","create_time"]

app = Flask(__name__)

def getNow():
now = datetime.now().strptime("%Y-%m-%d %H:%M:%S")
return now

@app.route('/user/userlist')
def userlist():
sql = "select %s from %s" %(','.join(fields),'users')
cur.execute(sql)
res = cur.fetchall()
users = [ dict((v,row[k]) for k ,v in enumerate(fields)) for row in res]
return render_template('userlist.html',users = users)

@app.route('/user/delete')
def delete():
id = request.args.get('id',None)
print id
d_sql = "No id error"
if id :
d_sql = "DELETE from users where id = %s" %  id
cur.execute(d_sql)
return redirect('/user/userlist')
return render_template('test.html',errmes = d_sql)

@app.route('/user/update',methods=['GET','POST'])
def update():
if request.method == "POST":
user = dict(request.form)
user = dict((k,v[0]) for k ,v in user.items())
#print user ==>{'mobile': u'CCC', 'name_cn': u'ccccccc', 'id': u'2', 'name': u'cc', 'email': u'CC@chinacache.com'}
#user.pop('id')
tmp_list = [ "%s='%s'"%(k,v) for k,v  in user.items() if k != "id"]
#print tmp_list
update_sql = "UPDATE users set %s  where id=%s" %(','.join(tmp_list),user['id'])
cur.execute(update_sql)
return redirect('/user/userlist')
else:
id = request.args.get('id',None)
print id
select_sql = "No id error"
if id :
select_sql = "select %s from users  where id = %s" %(','.join(fields),id)
print select_sql
cur.execute(select_sql)
res = cur.fetchone()
#print res ==>(2L, u'cc', u'cc', u'cC23 ', u'CC@chinacache.com', u'CCC', u'user', 0, datetime.datetime(2016, 11, 30, 16, 4, 33))
user = dict((v,res[k]) for k ,v in enumerate(fields))

#return redirect('/user/userlist')
return render_template('userinfo.html',user = user)

if __name__ == "__main__":
app.run(host='0.0.0.0',port=888,debug=True)
[root@test blog]#

##前端html代码
[root@test blog]# cat templates/userlist.html
<html>
<p>userlist</p>
<table border='1px'>
<thead>
<tr><th>Name</th>
<th>Name_CN</th>
<th>Email</th>
<th>Mobile</th>
<th>Role</th>
<th>Status</th>
<th>Create_Time</th>
<th>Operate></th></tr>
</thead>
<tbody>
{% for user in users %}
<tr><input type='hidden' name='id' value={{ user.id }}><td>{{ user.name}}</td>
<td>`user`.`name_cn`</td>
<td>`user`.`email`</td>
<td>`user`.`mobile`</td>
<td>`user`.`role`</td>
<td>`user`.`status`</td>
<td>`user`.`create_time`</td>
<td><a href='/user/update?id=`user`.`id`'>更新</a>  <a href='/user/delete?id=`user`.`id`'>删除</a></tr>
{% endfor %}
</tbody>
</table>
</html>
[root@test blog]#
[root@test blog]# cat templates/userinfo.html
<html>
<p>userinfo</p>
<form action="/user/update" method="POST">
<table>
<tr>
<td><input type="hidden" name='id' value=`user`.`id` ></td>
</tr>
<tr>
<td>Name<input type='text' name='name' value=`user`.`name`></td>
</tr>
<tr>
<td>Name_CN<input type='text' name='name_cn' value =`user`.`name_cn`></td>
</tr>
<tr>
<td>Email<input type='text' name='email' value=`user`.`email`></td>
</tr>
<tr>
<td>Mobile<input type='text' name='mobile' value=`user`.`mobile`></td>
</tr>
<tr>
<td>Role<select >
{% if user.role == "admin" %}
<option value = 'admin'>管理员</option>
{% elif user.role == "sa" %}
<option value = 'sa'>运 维</option>
{% else %}
<option value = 'user'>普通用户</option>
{% endif %}
</select>
</td>
</tr>
<tr>
<td>status<select >
{% if user.status == 0 %}
<option value = 0>正常</option>
{% else %}
<option value = 1>锁定</option>
{% endif %}
</select>
</tr>
<tr><input type="submit" value='确认修改'></td></tr>
</form>
</html>
[root@test blog]#


3.2 更新操作剖析
1.通过userlist获取到所有数据库中的数据以后,在userlist.html中展示出来,展示的时候添加一栏超链接<td><a href='/user/update?id=`user`.`id`'>更新</a> <a href='/user/delete?id=`user`.`id`'>删除</a></tr>可以实现更新删除两个选项。当点击更新按钮后的步骤为,获取更新的页面,将自己点击更新的那条元素的信息塞到页面对应的地方,更改我们想要的信息后,点击确认按钮post到逻辑端进行修改,然后跳转回userlist的用户列表界面。

2.userlist的html前端代码以及访问截图




3.点击更新后跳转页面




4.点击更新页面中的确认按钮后传递到逻辑端进行操作





3.3 更新操作总结
3.3.1 更新的大体流程分为两步:

I:GET获取更新用户信息后渲染到html页面,便于用户自己更改信息

II:POST将更改后的信息提交到逻辑端处理

3.3.2 更新的userinfo.html前端中,input标签内要记得写name参数,get请求是value值要为用户从数据库中查找出来的数据,form标签中的action='/路径'与监听路由一直,使得POST提交表单数据时能得到正确的处理。

3.3.3 html前端中的下拉框实现
<tr>
<td>Role<select >
{% if user.role == "admin" %}
<option value = 'admin'>管理员</option>
{% elif user.role == "sa" %}
<option value = 'sa'>运 维</option>
{% else %}
<option value = 'user'>普通用户</option>
{% endif %}
</select>
</td>
</tr>




3.4 删除操作
删除操作同更新,不过删除只需要一步,跟进用户id号删除。

具体步骤如下:GET方法获取到用户id号,拼接sql语句,逻辑端删除用户。完成删除操作

3.5 思路
开发中整体核心思想就是增、删、改、查这几种数据操作,不同的是后端查询获取数据是通过数据库还是API,开发的重点是思想。思想又分为技术思路和项目思路。

技术思路--增删改查

项目思路--用户管理系统、CMDB、监控系统等等。(主要涉及系统的功能要求,技术实现。比如常规的线上用户管理系统修改密码肯定是单独出来的一个功能)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POST GET 更新 删除