Python--Day6


学习要有定位,明确目标地去学习。希望自己能坚持下去,并有所收获---leaves


python05 -- python函数、文件小讲以及模块和初识flask Web框架



一、文件处理及相关函数


open(文件路径,打开模式) 或者with open() as f:

    读写、追加文件

    数据库


    #configparse 配置文件写成一个字典

    read   readline  readlines  

    write  writelines


    文件指针函数  

    tell()   文件指针的位置  

    seek()    移动指针

    flush()    将内存写入到硬盘上


二、函数

    **python核心思想: 函数化编程  ==>重点


2.1 函数概念

   函数:python编程中基本的单元

        def  函数名(参数可忽略):

            函数体

            return  返回值


2.2 函数的主要理解:函数式编程 FP


    一、注意理解hello 和 hello()的区别,前者是抽象的函数,后者是具体的返回值

    二、函数可以是参数,进行传递


##代码示例

In [1]: def fishing():
   ...:     print "diaoyu is good "
   ...:     return 'fish'
In [3]: fishing()
diaoyu is good 
Out[3]: 'fish'
In [5]: def doSth(fn):
   ...:     print fn() + 'is got '
   ...:     return 'ok'
 
In [6]: doSth(fishing)
diaoyu is good 
fishis got 
Out[6]: 'ok'


###sorted()函数配合lambda匿名函数实现排序
In [7]: arr = [('age',1),('age',19),('age',51),('age',13),('age',31),('age',41),('age',12)]
In [8]: print sorted(arr,key=lambda x:x[1])
[('age', 1), ('age', 12), ('age', 13), ('age', 19), ('age', 31), ('age', 41), ('age', 51)]


三、模块


3.1 模块定义


   模块:简单的理解,模块就是文件,我们可以把一个功能存在一个文件中,通过import调用.


3.2 模块的分类


    模块整体上分为三类:

    1.python自带的模块,如sys,os,math,random,time模块等


    2.第三方开发者开发的模块,可以通过pip install 安装,然后import调用导入使用,如flask,requests,pyquery,psutil等


    3.自己开发的模块

     引申:python中文件夹默认不能导入的,如果需要导入文件夹的话需要添加__init__.py文件,__init__.py文件可以为空,其主要目的是使文件夹变成包以达到可以导入的目的.

     调用格式:from  "文件目录名" import "导入的函数"


##自己开发的模块示例:

##自己编写的模块

[root@xiaowei code]# pwd
/usr/local/src/newbie/05/code
##文件编写的模块内容
[root@xiaowei code]# cat hello.py
def hello_world():
	print "hello world"
	
	
##ipython中导入模块及使用
In [1]: import hello
In [3]: print hello.hello_world()
hello world
None
In [4]: pwd
Out[4]: u'/usr/local/src/newbie/05/code'



3.3 模块调用的方式

  模块的使用主要有三种方式:

    

    1.import  模块名

        调用:模块名.函数名()


    2. from 模块名  import  函数名

        调用:函数名()


    3. from  模块名   import  * 

        调用:函数名()  #导入模块中所有函数,不推荐使用 


3.3.1  import的查找路径顺序:

    当前路径---> systempath(系统路径)

    1.当前路径:当前目录

    2.systempath

    3. 文件名不要和模块名重复以免调用异常


##systempath 的查看方法:
import sys
sys.path
In [7]: sys.path
Out[7]:
['',
'/usr/local/python27/bin',
'/usr/local/python27/lib/python27.zip',
'/usr/local/python27/lib/python2.7',
'/usr/local/python27/lib/python2.7/plat-linux2',
'/usr/local/python27/lib/python2.7/lib-tk',
'/usr/local/python27/lib/python2.7/lib-old',
'/usr/local/python27/lib/python2.7/lib-dynload',
'/usr/local/python27/lib/python2.7/site-packages',
'/usr/local/python27/lib/python2.7/site-packages/IPython/extensions',
'/root/.ipython']


3.3.2 **注意import 会把模块里的代码执行一遍


#示例代码

[root@xiaowei code]# python run.py 
Welcome Module Hello
hello world
None
[root@xiaowei code]# cat hello.py
def hello_world():
	print "hello world"
print "Welcome Module Hello"
[root@xiaowei code]# cat run.py 
import hello
print hello.hello_world()
[root@xiaowei code]# 
[root@xiaowei code]# python run.py 
Welcome Module Hello
hello world
None


3.3.3 import模块出现的矛盾

    问题,如3.3.2中的代码,如果引入的时候我不希望执行hello_world()函数外边的print语句,该怎么解决呢。

    

    为了解决引入模块时执行该引入模块中不需要的东西,所以Python中添加判断来解决

    if __name__ == "__main__":

        代码块

    将所引入模块其本身才需要执行的代码放到if判断内,以防止调用被随意的执行。


#示例代码如下:

##run.py 的内容
[root@xiaowei code]# cat run.py 
import hello
print hello.hello_world()

##hello.py的内容
[root@xiaowei code]# cat hello.py
def hello_world():
	print "hello world"
if __name__ == '__main__':  #<====练习__name__变量
	print "Welcome Module Hello"

	[root@xiaowei code]# python run.py 
hello world
None
[root@xiaowei code]#

       
3.3.4 python自带变量__name__


    __name__:该变量主要是为了识别执行的.py文件是否为函数的文件本身执行的,如果__name__ == "__main__"则证明是其本身执行的,否则,该函数被调用执行的。这时候__name__等于被调用的文件名。


####__name__ == "__main__"的情况

##主文件的内容
[root@xiaowei code]# cat hello.py
def hello_world():
	print "hello world"
	print" __name__  == '%s' " %(__name__)

if __name__ == '__main__':
	hello_world()
	print "Welcome Module Hello"
	
[root@xiaowei code]#
 
###执行主文件的结果
[root@xiaowei code]# python hello.py
hello world
 __name__  == '__main__' 
Welcome Module Hello



###被调用的执行情况:


###被引用的hello.py文件
[root@xiaowei code]# cat hello.py
def hello_world():
	print "hello world"

print" __name__  == '%s' " %(__name__)

if __name__ == '__main__':
	hello_world()
	print "Welcome Module Hello"
[root@xiaowei code]# 

###主程序文件run.py的内容
[root@xiaowei code]# cat run.py 
import hello

print hello.hello_world()

##程序的执行结果,非主程序执行的话,__name__等于被调用的文件名。

[root@xiaowei code]# python run.py 
 __name__  == 'hello' 
hello world
None


四、 Web开发之flask模块


4.1 安装flask

    pip install -y flask

##安装flask
[root@xiaowei code]#pip install -y flask 

##查看flask是否安装
[root@xiaowei code]# pip list |grep Flask 
Flask (0.11.1)
Flask-JSONRPC (0.3.1)
[root@xiaowei code]#


4.2 Web开发介绍

    随着php、python、javascript等脚本语言大爆发,导致web开发也进入新的时代.


    URL:统一资源标识符

     协议://域名:端口/资源地址?携带的参数1=2&参数2=3#页面锚点

    URI:统一资源定位符

 

    网络协议五元组(网络协议、用户ip、用户端口、服务ip、服务端口)


    Web开发框架之flask与djiago对比

        flask :

            简洁 、上手迅速 。第三方定制容易

        django :

        大而全,用第三方的定制比较难,不过django 已经很全了。文档很全面



4.3 第一个flask程序


4.3.1 flask的调用格式:

[root@xiaowei code]# cat flask_web.py

#引入flask的启动模块,写死的
from flask import Flask

##new app(新建一个flask的app也是写死的)
app = Flask(__name__)


##监听路由,就是url在域名和端口后面的
##当域名和端口后面,只有一个/的时候,这个路由触发
@app.route('/')
##路由对应的处理函数,触发路由的时候执行
#处理函数的返回值,显示在浏览器
def  index():
	return  "hello index"

@app.route('/test')
def  test():
	return  "hello test"	
	
if __name__ == "__main__":
        ##启动app,监听端口port
	app.run(host='0.0.0.0',port=888,debug=True)


4.3.2 结果如下:注意是监听路由出发后的处理函数返回值,在浏览器端显示

wKioL1g-lUCDPgKwAAEndooCcDc930.png-wh_50

wKiom1g-lUHQbd0YAAHM72jtda8282.png-wh_50



4.3.3 flask格式与web贯通

    URL:统一资源标识符

    协议://域名:端口/资源地址?携带的参数1=2&参数2=3#页面锚点

    资源就是我们要监听的

        资源地址就是@app.route()要写的东西

        常说的路由、接口,都是基于url的

        ?后边的全部参数,格式是key=value的形式。



4.4 flask中如何获取前端参数

    获取参数需要from flask  import request操作。request里面包含一次网络请求所有的内容,所有url的参数(GET方法获取得) 都在request.args这个变量里,request.args是一个类似dict的数据结构。

    

    flask通过request.arge.get()获取前端url给出的参数。


具体代码如下:见函数webone、webtwo

###注意一定要import  request函数后才能获取前端传递的参数

[root@xiaowei web_module]# cat flask_web.py 
#/usr/bin/python
#coding:utf-8

from flask import Flask ,request,render_template,redirect

##new app
app = Flask(__name__)
@app.route('/')
def  index():
	return  "hello index"
@app.route('/test')
def  test():
	return  "hello test"
##获取参数import request 
##request里面包含一次网络请求所有的内容
##request.args是一个类似dict的数据结构。
@app.route('/webone')
def webone():
	print request.args
	print 'requst.arge type is %s' %(type(request.args))
	return "Welcome to webone"
'''
##webone运行结果
ImmutableMultiDict([('name', u'aa')])
requst.arge type is <class 'werkzeug.datastructures.ImmutableMultiDict'>
192.168.137.1 - - [29/Nov/2016 16:03:24] "GET /webone?name=aa HTTP/1.1" 200 -
'''

@app.route('/webtwo')
def webotwo():
	tmp =  request.args.get('word','webtwo')
	return "The search word is %s" %tmp

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


实验截图如下:

wKiom1g-miCSE-WWAANXwwHHtRA725.png-wh_50


4.5 前端渲染html文件

    需要导入import render_template,默认渲染当前目录下templates目录中的html文件。


4.5.1 初识render_template渲染。

from flask import Flask ,request,render_template,redirect

##new app
app = Flask(__name__)
@app.route('/')
def  index():
	return  "hello index"
@app.route('/test')
def  test():
	return  "hello test"

##using render_template
@app.route('/web3')
def web3():
        tmp =  request.args.get('word','web3')
        age =  request.args.get('age',14)
        #arr = [{'name':'one','age':14},{'name':'two','age':32},{'name':'three','age':9}]
        #arr = readUser('users.txt')
        #print arr
        return render_template('web3.html',word = tmp,age = age)
        
if __name__ == "__main__":
        app.run(host='0.0.0.0',port=888,debug=True)


渲染后的结果如下

wKioL1g-nl2iqWdRAAJ4qAL_uz0762.png-wh_50


4.5.2 渲染的模板

    python中的渲染模板可以使用jinjia2,所谓的模板就是渲染html文件时可以传递变量,注意传递变量时使用关键字形式传递。

    渲染模板的形式:

    一、单个变量: {{ 变量 }}  包裹的是变量

    二、个数不确定 {% 变量 %} 包裹python的循环变量

        判断的语法:{% if 判断语句 %}

                中间的执行语句

               {%  endif  %}  


        循环的语法:{% for x in 变量 % }

                中间的执行语句

                {% endfor %}

          循环的变量如果为字典的话,则可以使用tmp.name和tmp[name]两种方式调用


##循环变量的渲染

小练习:在前端显示uers.txt的内容(web4函数)

[root@xiaowei web_module]# cat flask_web.py 
#/usr/bin/python
#coding:utf-8

from flask import Flask ,request,render_template,redirect
from getUser import readUser
##new app
app = Flask(__name__)
@app.route('/')
def  index():
	return  "hello index"
##using render_template

'''
##注意web4中f.read()的结果为字符串
In [21]: f = open('users.txt')

In [22]: f.read()
Out[22]: 'AA:123\nBB:32\ncc:1231\nkk:33\nAA1:11\ntt:12\nwoniu:11\n'
'''
@app.route('/web4')
def web4():
	tmp =  request.args.get('word','web3')
	age =  request.args.get('age',14)
	#arr = [{'name':'one','age':14},{'name':'two','age':32},{'name':'three','age':9}]
	f = open('users.txt')
	arr = [ line.split(":")  for line in f.read().split('\n') ]
	print arr
	return render_template('web3_2.html',word = tmp,age = age ,arr = arr)

if __name__ == "__main__":
	app.run(host='0.0.0.0',port=888,debug=True)
	
	
###渲染文件templates/web3_2.html内容
[root@xiaowei web_module]# cat templates/web3_2.html 
<!----arr = [['AA', '123'], ['BB', '32'], ['cc', '1231'], ['kk', '33'], ['AA1', '11'], ['tt', '12'], ['woniu', '11'], ['NULL', 'NULL'], ['Bob', '123'], ['Bib', 'aaa'], ['qqq', 'aaa'], ['gg', 'aa'], ['']]---->

<table border='1'>
	<thead>
	<tr>
		<th>Name</th>
		<th>Password</th>
	</tr>
	</thead>

	<tbody>
	{% for tmp  in arr %}
	{% if tmp[0]  and  tmp[1] %}
	<tr>
		<td>{{ tmp[0] }}</td>
		<td>{{ tmp[1] }}</td>
	</tr>
	{% endif %}
	{% endfor %}
	</tbody>
</table>
[root@xiaowei web_module]#


循环变量渲染后的执行结果图:

wKioL1g-pTPTqt0KAAFNkYmfYdw283.png-wh_50

遇到问题:前端显示是由于users.txt文件中存在空行情况,出现空表格现象。

    空行问题解决:

    1.python处理的时候判断(基本已经熟悉了)

    2. 前端显示做判断

        此处主要将jinjia2处理

        ##此处两种方式判断都可以

##小练习代码:
t = arr = [['AA', '123'], ['BB', '32'], ['cc', '1231'], ['kk', '33'], ['AA1', '11'],\
 ['tt', '12'], ['woniu', '11'], ['NULL', 'NULL'], ['Bob', '123'], ['Bib', 'aaa'], \
 ['qqq', 'aaa'], ['gg', 'aa'], ['']]
 
In [36]: for i in t:
    ...:     if len(i) ==  2  :
    ...:         print i 
    ...:     else :
    ...:         print "空行"
    ...:         
    ...:         
['AA', '123']
['BB', '32']
['cc', '1231']
['kk', '33']
['AA1', '11']
['tt', '12']
['woniu', '11']
空行
In [37]: for i in t:
    ...:     if i[0] and i[1]  :
    ...:         print i 
    ...:     else :
    ...:         print "空行"
    ...:         
    ...:         
['AA', '123']
['BB', '32']
['cc', '1231']
['kk', '33']
['AA1', '11']
['tt', '12']
['woniu', '11']
空行
In [38]:




注意:使用渲染时的目录层级结构

[root@xiaowei web_module]# tree 
.
├── flask_web.py
├── getUser.py
├── getUser.pyc
├── Readme.md
├── templates
│   ├── form.html
│   ├── web3_1.html
│   ├── web3_2.html
│   └── web3.html
├── users.txt
└── web2.py

1 directory, 10 files
[root@xiaowei web_module]#


4.6 flask的跳转

   web中有时候会出现需要跳转的需求,这个时候需要import redirect来实现跳转功能。


跳转完整代码如下

#/usr/bin/python
#coding:utf-8

from flask import Flask ,request,render_template,redirect
from getUser import readUser
##new app
app = Flask(__name__)
@app.route('/')
def  index():
        return  "hello index"
@app.route('/test')
def  test():
        return  "hello test"
##实现跳转功能,import redirect 函数
@app.route('/web5')
def web5():
        role = request.args.get('role','')
        if role == 'admin':
                return redirect('/test')
        else :
                return "please login"
if __name__ == "__main__":
        app.run(host='0.0.0.0',port=888,debug=True)


跳转结果截图

wKiom1g-qKKCCGhWAAIg9AXDa5Y683.png-wh_50


4.7 返回值扩展


    小tips return语句后边所有语句都不会执行

In [38]: def test():
    ...:     print '111'
    ...:     print '222'
    ...:     return "Done"
    ...:     print '33333'
    ...: 
In [39]: test()
111
222
Out[39]: 'Done'



五、HTML的常用标签


    HTML中解决乱码的方法:前端解决乱码==><mate charset='utf-8'>

注意w3c的代码测试网址:(可以在此网页上测试标签效果)

http://www.w3school.com.cn/tiy/t.asp?f=html5


5.1 常用的table标签

    <table>后端向前端展示数据

标签标签定义用法
<html>定义html的网页<html></html>
<table>定义HTML 表格<table></table>
<tr>

定义HTML 表格中的行。

tr元素包含一个或多个th或td元素。
<th>定义HTML 表头。<th></th>
<td>定义HTML 表格单元。<td></td>


5.2 常用的form标签

    <form>前端向后端提交数据 

    

    form 有一个action属性,提交的地址(URL)

    表单内容,有很多输入框<input>,(input没有闭合标签,跟其他标签不一样的地方需要注意)

        type = "text"   输入框

        type = 'submit' 提交按钮

        type = "password" 密码框,输入为小圆点

        type = 'checkbox' 多选框

        type = 'radio' 单选框

        type = 'date'   选日期

        type = 'color'   选颜色

        value = 'XX' 提交按钮上边的字


form标签练习:

<form action='URL'>
    <input type="text">
    <input type="submit" value='ok'>
</form>


###单选多选框
<!---单多选框--->

单选框
<form>
<input type='radio' name='sex'> 男
<input type='radio' name='sex'> 女
</form>

多选框
<form>
<input type = 'checkbox' >吃饭
<input type = 'checkbox' >睡觉
</form>


##时间和颜色
<!----日期和颜色--->
<form >
<input type='date' name = 'subtime'>
<input type = 'color'>
</form>

执行的结果图:


1.form结果图

wKioL1g-rQ2xXZ04AAAyCv974KQ108.png


2.单选多选框结果图

wKiom1g-rYTD1fcvAADyl-ZuJTA816.png


3. 时间颜色结果图

wKioL1g-rgegstLFAADimUTXLwI274.png


5.3 其他常用标签

    

<p>一段话</p>  :一段话

<br> 换行  ,也没有闭合标签

<hr> 一个横线

<a href = ''></a> 锚点,超链接。 锚点的href属性是跳转

<img  src = ""  widh='宽度'  height = '高度'>   图片标签,src属性是图片的地址

<button></button>  按钮

<div> </div>   盒子,没有默认样式

<span> </span> 默认的行内模式


HTML代码练习:

<div>
<hr>
<button>按钮</button>
<p>tes图 p 标签</p>
</div>

<img src = 'http://s4.51cto.com/wyfs02/M00/8A/C6/wKiom1g7pEjT_g0VAAF6gWCEbZk947.jpg' widh='40' height='70'>

<div>
<br>
<a href="http://gaozhao.51cto.com/activity/job-hunt1/index?login">登录</a>
</div>


执行结果图如下:

wKioL1g-rs-xvS-xAAD5B0fVbPc584.png

5.4 form标签结合flask实现前端提交注册用户名密码

   

  实现注册的代码:要求,通过/的index主页访问,在name和password框中输入用户名密码,点击add提交按钮直接写入到users.txt文件中,而后跳转到/web4页面列举出所有的用户名密码。

[root@xiaowei web_module]# cat web2.py 
#/usr/bin/python 
#coding:utf-8


###第二个web程序,练习form标签,熟悉前端向后端提交数据的流程

from flask import Flask,render_template,redirect,request

app = Flask(__name__)

@app.route('/')
def index():
	return render_template('form.html')

@app.route('/adduser')
def adduser():
	name = request.args.get('name','')
	passw = request.args.get('password','')
	with open('users.txt','a+') as files:
		files.write('%s:%s\n' %(name,passw))
	return redirect("/web4")

@app.route('/web4')
def web4():
       # tmp =  request.args.get('word','web3')
       # age =  request.args.get('age',14)
        #arr = [{'name':'one','age':14},{'name':'two','age':32},{'name':'three','age':9}]
        f = open('users.txt')
        arr = [ line.split(":")  for line in f.read().split('\n') ]
        print arr
       # return render_template('web3_2.html',word = tmp,age = age ,arr = arr)
        return render_template('web3_2.html',arr = arr)

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


执行流程及结果:

wKioL1g-sdvjtvFqAAJXJ6aSKYQ129.png