从零开始学Python-day8

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方法

wKiom1hgkdqi9OiIAAAu6PW4u_0165.png

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

wKioL1hgkenxmTxnAAApHz-UllU497.png

##具体实现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'[email protected]'}
		#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'[email protected]', 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前端代码以及访问截图

wKioL1hiBeGQ-ESyAAFWD_C1msI240.png

    

    3.点击更新后跳转页面

wKiom1hiB0zSOuA0AAGl0HwM9fw503.png

    

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

wKioL1hiCDiT6VIXAADpuKDiSuU399.png


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>

wKioL1hiCjKAyTYnAAAoz93La40274.png


3.4 删除操作

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

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


3.5  思路

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

    技术思路--增删改查

    项目思路--用户管理系统、CMDB、监控系统等等。(主要涉及系统的功能要求,技术实现。比如常规的线上用户管理系统修改密码肯定是单独出来的一个功能)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章