05访谈数据库,Python之函数总计

作者:云顶最新线路检测

全局变量和后生可畏都部队分变量:

在子程序中定义的变量称为局地变量,在程序的生龙活虎早先定义的变量称为全局变量。

全局变量功效域是成套程序,局地变量效率域是概念该变量的子程序。

当全局变量与部分变量同名时:在概念局地变量的子程序内,局地变量起效果;在别的地点全局变量起功能。

 

name='reese'
def change_name():
    print('我的名字',name)
change_name()


def change_name():
    name='帅'
    print('我的名字',name)
change_name()
print(name)


def change_name():
    global name
    name='帅'
    print('我的名字',name)
change_name()
print(name)

#输出结果:
我的名字 reese
我的名字 帅
reese
我的名字 帅
帅

 # 借使函数内部无global关键字,优先读取局地变量,能读取全局变量,无法对全局变量重新赋值;

    但对于可变类型(除数字、字符串、元祖,其余都可变卡塔 尔(阿拉伯语:قطر‎,可对在那之中因素进行操作。

# 借使函数内部有global关键字,变量本质上是全局变量,可读取可赋值。

# 平常全局变量名用大写,局地变量名用小写。

 

付费的商用数据库:

  • Oracle:标准的男神;

  • SQL Server:微软本人付加物,Windows定制专款;

  • DB2:IBM的出品,听上去挺高级;

  • Sybase:曾经跟微软是好好友,后来涉嫌打碎,现在家道惨淡。

那个数据库都以不开源并且付费的,最大的好处是花了钱出了难点能够找商家撤消,但是在Web的社会风气里,平时供给配置不知凡几的数据库服务器,当然无法把大把大把的银子扔给商家,所以,无论是谷歌(Google卡塔尔、Instagram,依然本国的BAT,无后生可畏例外都选拔了无需付费的开源数据库:

       1、重回四个值

1.2 Python特点

1.轻松学习:Python有相对超级少的首要字,结构轻松,和一个料定定义的语法,学习起来更为简约。

2.便于阅读:Python代码定义的更清楚。

3.便于维护:Python的名利双收在于它的源代码是十一分轻松保险的。

4.贰个周围的标准库:Python的最大的优势之一是丰裕的库,跨平台的,在UNIX,Windows和Macintosh宽容很好。

5.人机联作格局:相互形式的支撑,您能够从尖峰输入实施代码并拿走结果的言语,相互作用的测量检验和调弄收拾代码片断。

6.可移植:依照其开放源代码的风味,Python已经被移植(也正是使其职业卡塔 尔(英语:State of Qatar)到无数阳台。

7.可扩展:若是您要求大器晚成段运营高效的要害代码,只怕是想要编写一些不愿开放的算法,你能够使用C或C++实现那有个别顺序,然后从你的Python程序中调用。

8.数据库:Python提供全数重大的购销数据库的接口。

9.GUI编程:Python补助GUI能够成立和移植到多数系统调用。

10.可嵌入: 您能够将Python嵌入到C/C++程序,令你的先后的客户获得"脚本化"的力量。

1、协议

API与客商的通讯协议,总是接收HTTPs协议。

 

使用MySQL

MySQL是Web世界中动用最普及的数据库服务器。SQLite的表征是轻量级、可停放,但不可能担当高并发访谈,切合桌面和活动接收。而MySQL是为服务器端设计的数据库,能选取高并发访谈,同有时候占用的内部存款和储蓄器也远远出乎SQLite。

除此以外,MySQL内部有多种数据库引擎,最常用的引擎是支撑数据库事务的InnoDB。

def eee(*args,**kwargs):
    print(args,kwargs)

 eee(12,123)

1.3.1 Web程序支付

  Python平常被用来Web开垦。比如,通过mod_wsgi模块,Apache能够运功效Python编写的Web程序。使用Python语言编写的Gunicorn作为Web服务器,也能够运维Python语言编写的Web程序。Python定义了WSGI(Web Server Gateway Interface)标准使用接口来和睦Http服务器与基于Python的Web程序之间的牵连。一些Web框架,如Django、Pyramid、TurboGears、Tornado、web2py、Zope、Flask等,可以让程序猿轻便地开辟和拘系复杂的Web程序。

   Python对于各类网络左券的支撑很圆满,由此常常被用于编写服务器软件、网络蠕虫。第三方库Twisted扶植异步在线编写程序和大多数正规的网络公约(富含顾客端和服务器卡塔 尔(英语:State of Qatar),並且提供了多种工具,被相近用于编写高品质的服务器软件。另有gevent这么些流行的第三方库,相同能够协助高品质高产出的网络开销。

3、版本(Versioning)

有道是将API的版本号放入UWranglerL。

https://api.example.com/v1/

另意气风发种做法是,将版本号放在HTTP头音信中,但不及纳入U大切诺基L方便和直观。Github利用这种做法。

 

** 写在前方 ------------------> **
廖雪峰
菜鸟

View Code

1.3.2 GUI开发

   Python本人满含的Tkinter库能够扶植轻便的GUI(Graphical User Interface)开辟。但是越来越多的Python技师采用wxPython或然PyQt等GUI包来开拓跨平台的桌面软件。使用它们开辟的桌面软件运营速度快,与客商的桌面情况相相符。通过PyInstaller还是可以够将次第发表为独立的装置程序包。

   在无数操作系统里,Python是正统的系统组件。大大多Linux揭橥版以至NetBSD、OpenBSD和Mac OS X都集成了Python,能够在极端机下直接运转Python。有点Linux发表版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器、Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编排它的Portage包管理连串。Python规范库满含了多少个调用作业系统功效的库。通过pywin32这么些第三方软件包,Python能够访谈Windows的COM服务及任何Windows API。使用IronPython,Python程序能够直接调用.Net Framework。

  • - 为别人提供劳务
  • - 前后端抽离,四个写vue,三个写后端,他们之间都以因而ajax央浼

概念函数:

def ret():
    print(111)
    return
    print(222)

re = ret()
print(re)

1.3.3 其他

  NumPy、SciPy、Matplotlib能够让Python技术员编写科学计算程序。有个别企业会使用Scons替代make创设C++程序。

  超多游玩选择C++编写图形呈现等高品质模块,而使用Python大概Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简约、体量越来越小;而Python则扶助越来越多的表征和数据类型。相当多戏耍,如EVE Online使用Python来拍卖游戏中美妙绝伦的逻辑。

  YouTube、Google、Yahoo!、NASA都在里边多量地行使Python。OLPC的作业系统Sugar项目标大相当多软件都以行使Python编写。

于是Python的利用范围差不离分为:数据深入深入分析、系统一编写程、组件集成、网络服务、图像管理、数值总结和科学计算。

 

 

 

 

1、什么是API?

函数的参数:

无偿的开源数据库

  • MySQL:我们都在用,平时错不了;

  • PostgreSQL:学术气息有一些重,其实挺不错,但人气未有MySQL高;

  • SQLite:嵌入式数据库,符合桌面和移动使用。

作为Python开垦技术员,选拔哪位免费数据库呢?当然是MySQL。因为MySQL遍布率最高,出了错,能够十分轻便找到解决办法。何况,围绕MySQL有一大堆监控和平运动维的工具,安装和选拔很方便。

      a、装饰器的真相:闭包函数

1、 Python入门导学

2、应用:

重视是做Token验证  url中as_view里面调用了dispatch方法。

能够有两种方式

 

安装MySQL驱动

是因为MySQL服务器以独立的经过运维,并通过网络对外服务,所以,供给协理Python的MySQL驱动来连选取MySQL服务器。MySQL官方提供了mysql-connector-python驱动,但是安装的时候供给给pip命令加上参数--allow-external:

$ pip install mysql-connector-python --allow-external mysql-connector-python

假定地方的指令安装失利,可以尝试另一个使得:

$ pip install mysql-connector

笔者们演示怎么着连接到MySQL服务器的test数据库:

# 导入MySQL驱动:
>>> import mysql.connector
# 注意把password设为你的root口令:
>>> conn = mysql.connector.connect(user='root', password='password', database='test')
>>> cursor = conn.cursor()
# 创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行记录,注意MySQL的占位符是%s:
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
>>> cursor.rowcount
1
# 提交事务:
>>> conn.commit()
>>> cursor.close()
# 运行查询:
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s', ('1',))
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 关闭Cursor和Connection:
>>> cursor.close()
True
>>> conn.close()

出于Python的DB-API定义都以通用的,所以,操作MySQL的数据库代码和SQLite相仿。

         2、遵照注重字传参

1.3 Python 应用项景

9、再次来到结果

针对分化操作,服务器向客户重临的结果应当适合以下标准

GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

 

数据库类别

第豆蔻梢头选取多少个关周全据库。近些日子平淡无奇利用的关周密据库也就那样三种:

 

1.1 Python概念

Python(英国失声:/ˈpaɪθən/ U.S.A.失声:/ˈpaɪθɑːn/)是三个高档案的次序的结合精晓释性、编写翻译性、相互作用性和面向对象的脚本语言。

Python 的希图有所很强的可读性,相比较其余语言平日利用波兰语关键字,其余语言的一些标点符号,它具有比别的语言更有风味语法结构。

Python 是意气风发种解释型语言: 那代表开荒进度中尚无了编写翻译那一个环节。相符于PHP和Perl语言。

Python 是交互作用式语言: 那意味,您能够在多个Python提醒符,直接相互作用试行写你的次第。

Python 是面向对象语言: 那象征Python协助面向对象的风格或代码封装在指标的编制程序技巧。

Python 是初我们的言语:Python 对初级技士来说,是后生可畏种宏大的言语,它支持广大的应用程序开辟,从容易的文字管理到 WWW 浏览器再到娱乐。

10、Hypermedia API  超媒体API

RESTful API最棒成功Hypermedia,即重回结果中提供链接,连向任何API方法,使得客户不查文书档案,也亮堂下一步应该做怎么样。

比方,当客户向api.example.com的根目录发出央求,会获得如此一个文书档案。

{"link": {
  "rel":   "collection https://www.example.com/zoos",  #表示这个API与当前网址的关系(collection关系,并给出该collection的网址)
  "href":  "https://api.example.com/zoos",  #API路径
  "title": "List of zoos",  #API的标题
  "type":  "application/vnd.yourformat+json"  #返回类型
}}

Hypermedia API的宏图被称呼HATEOAS。Github的API正是这种设计,访问api.github.com会获得四个独具可用API的网站列表。

{
  "current_user_url": "https://api.github.com/user",
  "authorizations_url": "https://api.github.com/authorizations",
  // ...
}

从地点能够观察,要是想获取当前客户的音信,应该去拜访api.github.com/user,然后就收获了下边结果。

{
  "message": "Requires authentication",
  "documentation_url": "https://developer.github.com/v3"
}

经过:正是从未重回值的函数

安装MySQL

可以间接从MySQL官网下载最新的Community Server 5.6.x版本。MySQL是跨平台的,接受相应的平台下载安装文件,安装就可以。

设置时,MySQL会唤醒输入root顾客的口令,请必得记清楚。假若怕记不住,就把口令设置为password。

在Windows上,安装时请采纳UTF-8编码,以便正确地拍卖粤语。

在Mac或Linux上,必要编写制定MySQL的安排文件,把数据库暗中认可的编码全体制改过为UTF-8。MySQL的布局文件默许寄放在 /etc/my.cnf或者 /etc/mysql/my.cnf

[client]
default-character-set = utf8

[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci

重启MySQL后,能够因此MySQL的顾客端命令行检查编码:

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor...
...

mysql> show variables like '%char%';
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   |
| character_set_connection | utf8                                                   |
| character_set_database   | utf8                                                   |
| character_set_filesystem | binary                                                 |
| character_set_results    | utf8                                                   |
| character_set_server     | utf8                                                   |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.1.65-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.00 sec)

注:如若MySQL的本子≥5.5.3,能够把编码设置为utf8mb4,utf8mb4和utf8一心合作,但它辅助新型的Unicode标准,能够展现emoji字符。

图片 1图片 2

生龙活虎对使用

图片 3图片 4

from app01 import views
from django.conf.urls import url
urlpatterns = [
    # django rest framework
    url('^hosts/', views.HostView.as_view()),
    url(r'^auth/', views.AuthView.as_view()),
]

urls.py

图片 5图片 6

from django.shortcuts import render,HttpResponse
# Create your views here.
from rest_framework.views import  APIView
from rest_framework.views import Request
from rest_framework.authentication import SessionAuthentication
from rest_framework.authentication import BaseAuthentication, BasicAuthentication
from rest_framework.parsers import JSONParser
from rest_framework.negotiation import  DefaultContentNegotiation
from rest_framework.exceptions import APIException
from app01 import models
from rest_framework.response import Response  #友好的显示返回结果



class AuthView(APIView):
    #auth登录页面不需要验证,可设置
    authentication_classes = []  #登录页面不需要认证
    def get(self,request):
        '''
        接收用户名和密码
        :param request:
        :return:
        '''
        ret = {'code':1000,'msg':None}
        user = request.query_params.get('username')

        pwd = request.query_params.get('password')
        print(user,pwd)
        obj = models.UserInfo.objects.filter(username=user,password=pwd).first()
        print(obj)
        if not obj :
            ret['code'] = 1001
            ret['msg'] = '用户名或者密码错误'
            return Response(ret)
        #创建随机字符串
        import time
        import hashlib
        ctime = time.time()
        key = '%s|%s'%(user,ctime)
        m = hashlib.md5()
        m.update(key.encode('utf-8'))
        token = m.hexdigest()

        #保存数据
        obj.token = token
        obj.save()

        ret['token'] = token
        return Response(ret)

class HostView(APIView):
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    # authentication_classes = [MyAuthtication]

    def get(self,request,*args,**kwargs):
        print(request.user,'dddddddddddffffff')
        print(request.auth,'dddddddddd')
        #原来的request,django.core.handlers.wsgi.WSGIRequest
        #现在的request ,rest_framework.request.Request
        # print(request)
        authentication_classes = [SessionAuthentication,BaseAuthentication]
        # print(self.authentication_classes)  # [<class 'rest_framework.authentication.SessionAuthentication'>,
                                            #  <class 'rest_framework.authentication.BasicAuthentication'>]
        return HttpResponse('GET请求的响应内容')

    def post(self,request,*args,**kwargs):
        pass
        # try:
        #     try :
        #         current_page = request.POST.get("page")
        #
        #         current_page = int(current_page)
        #         int("asd")
        #     except ValueError as e:
        #         print(e)
        #         raise #如果有raise说明自己处理不了了,就交给下面的一个去捕捉了
        # except Exception as e:
        #     print("OK")


        return  HttpResponse('post请求的响应内容')

    def put(self, request, *args, **kwargs):
        return HttpResponse('put请求的响应内容')

Views.py

 

图片 7图片 8

  • REST与技能非亲非故,代表的是后生可畏种软件架构风格,REST是Representational State Transfer的简单称谓,汉译为“特色状态转移
  • REST从财富的角度类审视整个网络,它将布满在互联网中有个别节点的能源通过U瑞鹰L进行标志,客商端应用通过URubiconL来获取财富的风味,得到那一个特征以致那个应用调换状态
  • 具备的数据,不管是由此互联网获取的依旧操作数据库获得(增加和删除改查卡塔尔的数码,都以能源,将全部数据便是能源是REST不一样与任何框架结构风格的最本质属性
  • 对此REST这种面向能源的架构风格,有人建议风流罗曼蒂克种崭新的布局理念,即:面向财富架构(ROA:Resource Oriented Architecture)
    • 对互联英特网的自由东西都视为财富,他认为二个url正是二个能源举例:

 

            2、包:蕴涵对表面函数的成效域中变量的引用

方式一:FBV模式:

图片 9图片 10

from django.contrib import admin

from django.conf.urls import url, include
from app01 import views
from app02 import views

urlpatterns = [
    url('admin/', admin.site.urls),
    # path('hosts/',views.HostView.as_view()),
    url('app02/', include('app02.urls'))
]

全局url

图片 11图片 12

from app02 import views
from django.conf.urls import url
urlpatterns = [
    url('^users/', views.users),
    url('^user/(d+)', views.user),


]

app02/url

图片 13图片 14

from django.shortcuts import render,HttpResponse

# Create your views here.
import json

def users(request):
    response = {'code':1000,'data':None}  #code用来表示状态,比如1000代表成功,1001代表
    response['data'] = [
        {'name':'haiyan','age':22},
        {'name':'haidong','age':10},
        {'name':'haixiyu','age':11},
    ]
    return HttpResponse(json.dumps(response))  #返回多条数据

def user(request,pk):
    if request.method =='GET':
        return HttpResponse(json.dumps({'name':'haiyan','age':11}))  #返回一条数据
    elif request.method =='POST':
        return HttpResponse(json.dumps({'code':1111}))  #返回一条数据
    elif request.method =='PUT':
        pass
    elif request.method =='DELETE':
        pass

views

 

松手函数:

图片 15

 

 

 

 

       b、第二种

1、自定义表达法规 

详见链接

class MyAuthtication(BasicAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')  #注意是没有GET的,用query_params表示
        if token == 'zxxzzxzc':
            return ('uuuuuu','afsdsgdf') #返回user,auth
        raise APIException('认证错误')

class UserView(APIView):
    authentication_classes = [MyAuthtication,]
    def get(self,request,*args,**kwargs):
        print(request.user)
        print(request.auth)
        return Response('用户列表')

函数成效域

 

功能域在概念函数时就曾经固化住了,不会随着调用地方的改动而改革

name = "reese"
def s():
    name = "neo"
    def n():
        print(name)
    return n

func = s()
func()

#输出:
neo

 

14、函数值装饰器

互连网应用程序,分为前端和后端多个部分。当前的发展趋势,就是后边三个设备不可胜言(手提式有线电话机、平板、桌面计算机、别的专项使用设备......卡塔尔国。

#参数组:**字典 *列表
def test(x,*args,**kwargs):
    print(x)
    print(args,args[-1])
    print(kwargs,kwargs.get('s'))
test(1,*[1,2,3],**{'s':1})

#输出结果:
1
(1, 2, 3) 3
{'s': 1} 1

21、生成器

6、过滤音信(Filtering卡塔尔

只要记录数据过多,服务器不大概都将它们重临给顾客。API应该提供参数,过滤重回结果。

下边是部分广泛的参数。

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件

参数的两全允许存在冗余,即允许API路线和UCR-VL参数有时有重新。例如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的意义是同等的。

 

   b、重临值不为None

7、状态码(status codes)

服务器向客户再次回到的状态码和提醒消息,管见所及的有以下一些(方括号中是该状态码对应的HTTP动词卡塔尔。

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

状态码的通通列表参见这里。

def test(x,y,z): #x=1,y=2,z=3
    print(x)
    print(y)
    print(z)

#位置参数,必须一一对应,缺一不行多一也不行
test(1,2,3)

#关键字参数,无须一一对应,缺一不行多一也不行
test(y=1,x=2,z=3)

#输出结果:
1
2
3
2
1
3

  l、、open---打开,关闭,close

答:API正是接口,提供的url。接口有三个用项:

reduce函数:

拍卖三个行列,然后把连串进行统风度翩翩操作

#  reduce函数
from functools import reduce

num = [1, 2, 3, 4, 5]
print(reduce(lambda x, y: x + y, num, ))

#输出:
15

 

暗许参数

5、HTTP动词

对于财富的具体操作类型,由HTTP动词表示。

常用的HTTP动词有上边八个(括号里是呼应的SQL命令卡塔 尔(英语:State of Qatar)。

GET(SELECT):从服务器取出资源(一项或多项)。即获取数据
POST(CREATE):在服务器新建一个资源。 即添加数据
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。即更新数据
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。即更新数据
DELETE(DELETE):从服务器删除资源  。即删除数据

还也许有八个一时用的HTTP动词。

HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

下边是一些例证:

GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

 

 

方式二:CBV模式

图片 16图片 17

 from app02 import views
 from django.conf.urls import url
 urlpatterns = [
     url('^users/', views.UsersView.as_view()),
     url('^user/', views.UserView.as_view()),
 ]

app02/urls

图片 18图片 19

from django.views import View
class UsersView(View):
    def get(self,request):
        response = {'code':1000,'data':None}
        response['data'] = [
            {'name': 'haiyan', 'age': 22},
            {'name': 'haidong', 'age': 10},
            {'name': 'haixiyu', 'age': 11},
        ]
        return HttpResponse(json.dumps(response),stutas=200)

class UserView(View):
    def get(self,request,pk):
        return HttpResponse(json.dumps({'name':'haiyan','age':11}))  #返回一条数据
    def post(self,request,pk):
        return HttpResponse(json.dumps({'code':1111}))  #返回一条数据
    def put(self,request,pk):
        pass
    def delete(self,request,pk):
        pass

views

凭仗django完毕的API大多功力都亟待大家自身费用,那个时候djangorestframework就给大家提供了有益,直接基于它来回到数据,同理可得原理都以同等的,便是给叁个接口也正是url,让前面叁个的人去央浼那个url去获取数据,在页面上海展览中心示出来。那样也就直达了前后端抽离的功用。上面我们来拜访基于Django Rest Framework框架达成

图片 20

def f1(x):  

    if x % 2 == 1:  

       return x + 100  

    else:  

       return x  

ret = map(f1, [1,2,3,4,5])  

ret2 = map(lambda x: x + 100if x % 2 == 1 else x ,[1,2,3,4,5])  

print(ret)  

for i in ret :  

    print(i) 

2、域名

有三种方法

方法生龙活虎: 尽量将API安排在专项使用域名(会设有跨域难点卡塔 尔(阿拉伯语:قطر‎

https://api.example.com

方法二:要是明确API很简短,不会有越来越扩充,能够考虑放在主域名下。

https://example.org/api/

 

      b、可迭代合同——凡是可迭代的内部都有一个__iter__方法

4、路径(Endpoint)

门路又称"终点"(endpoint卡塔尔国,表示API的求实网站。

在RESTful框架结构中,每种网站代表大器晚成种能源(resource卡塔 尔(阿拉伯语:قطر‎,所以网站中不可能有动词,只好闻明词,并且所用的名词往往与数据库的表格名对应。日常的话,数据库中的表都是同种记录的"集结"(collection卡塔尔国,所以API中的名词也应该接纳复数。

比方来讲来讲,有三个API提供动物公园(zoo卡塔尔的音讯,还包罗各样动物和雇员的音讯,则它的门径应该设计成下边那样。

https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

无名函数:

没有必要体现的钦赐函数

def calc(x):
    return x + 10


res = calc(10)
print(res)

#输出:
20


#用匿名函数:
func = lambda x: x + 10
print(func(10))

#输出:
20

 

func = lambda x, y, z: x + y + z
print(func(1, 2, 3))

#输出:
6

 

 

4、重回值的二种状态

故此,必须有生机勃勃种统黄金时代的编写制定,方便不相同的前端设备与后端举行通讯。这诱致API构架的流行,以致出现"API First"的两全观念。RESTful API是当下比较早熟的黄金时代套互连网应用程序的API设计理论。

 

25、内置函数

8、错误管理(Error handling卡塔 尔(英语:State of Qatar)

万豆蔻梢头状态码是4xx,就应当向客商重返出错音信。平时的话,重临的音信大校error作为键名,出错消息作为键值就可以。

{
    error: "Invalid API key"
}

递归 

#递归调用

def calc(n):
    print(n)
    if int(n / 2) == 0:
        return n
    s = calc(int(n / 2))
    return s


calc(10)

#输出:
10
5
2
1

 

递归本性:

  1. 必需有一个威名赫赫的终结条件

2. 老是走入更加深生龙活虎层递归时,难题规模相比较上次递归都应负有减削

  1. 递归功用不高,递归等级次序过多会促成栈溢出(在微型机中,函数调用是因而栈(stack卡塔 尔(阿拉伯语:قطر‎这种数据结构实现的,

每当步入三个函数调用,栈就能够加大器晚成层栈帧,每当函数重返,栈就能够减生龙活虎层栈帧。由于栈的抑扬顿挫不是独占鳌头的,所以,递归调用的次数过多,会造成栈溢出卡塔尔

 

#问路

import time

person_list=['林克','士官长','奎爷','但丁']
def ask_way(person_list):
    print('-'*60)
    if len(person_list) == 0:
        return '没人知道'
    person=person_list.pop(0)
    if person == '但丁':
        return '%s说:我知道,路在脚下,走多了,也就知道了' %person
    print('hi 美男[%s],敢问路在何方' %person)
    print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' %(person,person_list))
    time.sleep(3)
    res=ask_way(person_list)
    # print('%s问的结果是: %res' %(person,res))
    return res



res=ask_way(person_list)

print(res)

 

模式    描述
r      打开一个文件为只读。文件指针被放置在文件的开头。这是默认模式。
rb     打开一个文件只能以二进制格式读取。文件指针被放置在文件的开头。这是默认模式。
r+     打开用于读和写文件。文件指针置于该文件的开头。
rb+    打开用于读取和写入二进制格式的文件。文件指针置于该文件的开头。
w      打开一个文件只写。如果文件存在覆盖该文件。如果该文件不存在,则创建写入新文件。
wb     打开一个文件只能以二进制格式写入。如果文件存在覆盖该文件。如果该文件不存在,则创建写入新文件。
w+     打开文件为写入和读取模式。如果文件存在覆盖现有文件。如果该文件不存在,创建用于读写操作的新文件。
wb+    打开用于以二进制格式写入和读出文件。如果文件存在覆盖现有文件。如果该文件不存在,创建用于读写操作的新文件。
a      打开用于追加的文件。文件指针是在文件是否存在该文件的末尾。也就是说,该文件是在追加模式。如果该文件不存在,它会创建一个用于写入的新文件。
ab     打开文件用于二进制格式追加。文件指针是在文件是否存在该文件的末尾。也就是说,文件是在追加模式。 如果该文件不存在,它会创建一个用于写入的新文件。
a+     打开文件为追加和读取方式。文件指针是在文件是否存在该文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建用于读写操作的新文件。
ab+    打开一个文件以附加和二进制格式读取模式。如果该文件存在文件指针在该文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建读写操作的新文件。

大局使用

图片 21图片 22

#注册认证类
REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'UNAUTHENTICATED_TOKEN': None,  #将匿名用户设置为None
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "app01.utils.MyAuthentication",
    ],
}

settings

图片 23图片 24

from  rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException
from app02 import models


class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token=request.query_params.get('token')
        print(token)
        obj=models.UserInfo.objects.filter(token=token).first()
        print(obj)
        if obj:
            return (obj.username,obj)
        raise  APIException('没有通过验证')

大局验证

注:rest_framewor是叁个app供给settings里面设置。

图片 25

欣逢那些荒诞正是因为从没在settins中注册rest_framework.

设若不想用暗中同意的沙盘突显,只想展现json数据,则

from rest_framework.renderers import JSONRenderer

class HostView(APIView):
    renderer_classes = [JSONRenderer,]

    def get(self,request,*args,**kwargs):
        self.dispatch
        print(request.user)
        print(request.auth)
        return Response('主机列表')

 

#语法
def 函数名(参数1,参数2,参数3,...):
    '''注释'''
    函数体
    return 返回的值

#函数名要能反映其意义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)


str_len = mylen()
print(str_len)

这正是说先来轻便询问一下

map函数:

 

num = [3, 4, 5, 6, 11, 7, 54]
#lambda x:x+1
def add_one(x):   #列表元素自增一
    return x + 1

#lambda x:x-1
def minus_one(x):  #列表元素自减一
    return x - 1


def map_test(func, array):
    ret = []
    for i in num:
        res = func(i)
        ret.append(res)
    return ret
print(map_test(add_one,num))
# print(map_test(lambda x:x+1,num)) #可用匿名函数
print(map_test(minus_one,num))
# print(map_test(lambda x:x-1,num))


#终极版本
def map_test(func,array):
    ret = []
    for i in array:
        res = func(i)
        ret.append(res)
    return ret

print(map_test(lambda x:x+1,num))

#输出结果:
[4, 5, 6, 7, 12, 8, 55]
[2, 3, 4, 5, 10, 6, 53]
[4, 5, 6, 7, 12, 8, 55]

 

 map:

拍卖种类中的每种成分,获得的结果是贰个列表,该列表元素个数及任务与原本同样

num = [3, 4, 5, 6, 11, 7, 54]
res=map(lambda x:x+1,num)
print('内置函数map,处理结果',list(res))

print(list(map(minus_one,num)))

msg = "reese"
print(list(map(lambda x:x.upper(),msg)))

#输出结果:
内置函数map,处理结果 [4, 5, 6, 7, 12, 8, 55]
[2, 3, 4, 5, 10, 6, 53]
['R', 'E', 'E', 'S', 'E']

 

      a、迭代器合同 : 05访谈数据库,Python之函数总计。个中落到实处了__iter__ __next__方法

 

生成器函数

 

图片 26图片 27

  • 形参:独有在被调用时才分配内存单元,在调用截止时,立刻释放所分配的内部存款和储蓄器单元。因而,形参只在函数内部有效。
  • 实参:能够是常量、变量、表明式、函数等,在开展函数调用时,都必须要有规定的值,以便把那些值传给形参。 

三级菜单

filter函数:

有利体系中的每一种成分,决断每一种成分得到布尔值,假如是True则留下来

people = ['reese', 'neo_s', '林克']
print(filter(lambda n: not n.endswith('s'), people))

res = filter(lambda n: not n.endswith('s'), people)
print(list(res))

print(list(filter(lambda n: not n.endswith('s'), people)))

#输出:
<filter object at 0x04E612B0>
['reese', '林克']
['reese', '林克']

 

 

图片 28图片 29

def ccc(*args):#1,2,3,4,5
    print(args)

ccc(1,2,3,4,5)#按位置传参数

t = (1,2,3,4,5)
ccc(t)  ((1, 2, 3, 4, 5),)
ccc(*t)  (1, 2, 3, 4, 5)
复制代码
temp = "asdfsdfs"  

r = isinstance(temp, list)  

print(r)

   返回值=函数名(参数1,参数2)

 

            1、闭:内部函数

 

n*n

def aaa(a,b):
    print(a,b)
aaa(1,2)

图片 30图片 31

              a、*args

i = abs(-123)  

print(123)

10、动态参数

        

def hei():
    x = 20
    def inner():
        print(x)  #局部的
    return inner

i = hei()
i()  #全局

本文由云顶最新线路检测发布,转载请注明来源

关键词: