当前位置: 代码迷 >> 综合 >> Q安X面试总结-【内建函数】【redis】【进程线程】【celery】【魔法方法】【列表某个元素复制n份】【Flask和Django框架request/response的请求参数】
  详细解决方案

Q安X面试总结-【内建函数】【redis】【进程线程】【celery】【魔法方法】【列表某个元素复制n份】【Flask和Django框架request/response的请求参数】

热度:6   发布时间:2023-12-29 14:22:13.0

1.python的内建函数

help()函数:查看帮助信息;

id() 函数:查看对象的内存地址;

type()函数:查看对象的类型;

isinstance()函数:判断对象类型;

dir()函数:查看对象中的属性、方法等;

len()函数:计算可迭代对象的长度;

dir()函数:显示函数内置属性和方法;

delattr(object, name):删除object对象的某个属性;

hasattr() 函数用于判断对象是否包含对应的属性。

getattr() 函数用于返回一个对象属性值。

setattr():用于设置属性值,该属性不一定是存在的。

open():用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写

input():函数接受一个标准输入数据,返回为 string 类型。
其他如
list(),tuple(),set(),dict(),int(),float(),str(),
map(),filter(),sorted(),format(),sum(),max(),min()…等

2.redis 数据类型和常见操作方法:

数据类型:string、list、hash、set、zset

string操作:
set key value
setex key seconds value 设置过期时间
mset key1 value1 key2 value2 …
append key value
expire key seconds

get key
mget key1 key2 …

del key1 key2 …

hash操作:
hset key field value
hmset key field1 value1 field2 value2 …

hkeys key
hmget key field1 field2 …
hvals key 获取所有的属性值

hdel key field1 field2 …

list类型:
lpush key value1 value2 …
rpush key value1 value2 …
linsert key before或after 现有元素 新元素

lset key index value

lrem key count value
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有

lrange key start stop

set类型:
sadd key member1 member2 …

smembers key

srem key

zset类型:
zadd key score1(权重) member1 score2 member2 …

zrange key start stop

返回score值在min和max之间的成员
zrangebyscore key min max

返回成员member的score值
zscore key member

zrem key member1 member2 …

删除权重在指定范围的元素
zremrangebyscore key min max

3.进程和线程的区别

1.进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位;

2.一个程序至少有一个进程,一个进程至少有一个线程。线程依赖于进程而存在;

3.线程的资源开销比进程小,使得多线程程序的并发性高;

4.进程在执行过程中拥有独立的内存单元,进程之间不共享全局变量。而多个线程共享内存,从而极大地提高了程序的运行效率;

5.主线程会等待所有的子线程结束后才结束,主进程如果需要等待子进程执行完再退出,需要设置join等待。

6.进程间通信可以使用:pipe管道、 message queue消息队列、semophore 信号量、共享内存、socket套接字

7.线程同步方式:互斥锁(可重入锁)、 Semaphore(信号量)、condiction条件判断、同步队列,event事件。

4.celery任务调用方法

delay() 方法是强大的 apply_async() 调用的快捷方式。相当于使用 apply_async()。
二者作用相同,只是 apply_async 可以进行更多的任务属性设置,比如 callbacks/errbacks 正常回调与错误回调、执行超时、重试、重试时间等等

5.常见的魔法属性

  1. doc
    表示类的描述信息

  2. moduleclass
    module 表示当前操作的对象在那个模块
    class 表示当前操作的对象的类是什么

  3. init
    初始化方法,通过类创建对象时,自动触发执行

  4. del
    当对象在内存中被释放时,自动触发执行。

  5. call
    对象后面加括号,触发执行。

  6. dict
    类或对象中的所有属性

  7. str
    如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

8、getitemsetitemdelitem
用于索引操作,如字典。以上分别表示获取、设置、删除数据

9、getslicesetslicedelslice
该三个方法用于分片操作,如:列表

10、iter()魔法方法 让一个对象变得可以迭代

11、next()魔法方法 定义一个迭代器,让其能够通过next(迭代对象的迭代器)对一个可迭代对象进行迭代

12、 enter(),exit() 魔法方法,上下文管理器时使用,enter() 进入‘上文操作’,exit()进入下文操作

6.列表里某个元素复制n份

li2 = ['a', 'b', 'c', 'd']def list_insert(str1,num,li):"""列表中指定元素复制n份:param str1: 指定元素:param num: 复制n份:return: 新列表"""if str1 not in li or len(str1) > 1:  # 如果元素不在列表里面或其不止一个元素,直接返回print('无效操作')returnindex = li2.index(str1)if index == 0:for i in range(num):li2.insert(0, str1)elif index == len(li2) - 1:for i in range(num):li2.append(str1)else:for i in range(num):li2.insert(index, str1)print(li2)list_insert('a', 5, li2)

7.Flask框架获取请求参数(request)

request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)
request.data:记录请求的数据,并转换为字符串
request.form:记录请求中的表单数据
request.args:记录请求中的查询参数
request.cookies:记录请求中的cookie信息
request.headers:记录请求中的报文头
request.method:记录请求使用的HTTP方法
request.url:记录请求的URL地址
request.files:记录请求上传的文件

8.Flask框架响应response

(1)返回JSON
在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应

@app.route('/demo4')
def demo4():json_dict = {
    "user_id": 10,"user_name": "laowang"}return jsonify(json_dict)

(2)重定向
重定向到自己写的视图函数

  • 可以直接填写自己 url 路径
  • 也可以使用 url_for 生成指定视图函数所对应的 url
# 重定向
@app.route('/demo5')
def demo5():return redirect('http://www.itheima.com')@app.route('/demo1')
def demo1():return 'demo1'# 重定向
@app.route('/demo5')
def demo5():return redirect(url_for('demo1'))

重定向到带有参数的视图函数

  • 在 url_for 函数中传入参数
# 路由传递参数
@app.route('/user/<int:user_id>')
def user_info(user_id):return 'hello %d' % user_id# 重定向
@app.route('/demo5')
def demo5():# 使用 url_for 生成指定视图函数所对应的 urlreturn redirect(url_for('user_info', user_id=100))

(3)自定义状态码
在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666

@app.route('/demo6')
def demo6():return '状态码为 666', 666

9.Django框架获取请求参数(request)

(1)未命名参数按定义顺序传递;
(2)命名参数按名字传递;
(3)获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
(4)前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象;只要请求体的数据是表单类型,无论是哪种请求方式(POST、PUT、PATCH、DELETE),都是使用request.POST来获取请求体的表单数据。
(5)非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。
(6)请求头:可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
(7)request.method:一个字符串,表示请求使用的HTTP方法,常用值括:‘GET’、‘POST’。
(8)request.user:请求的用户对象。
(9)request.path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
(10)request.encoding:一个字符串,表示提交的数据的编码方式。如果为None则表示使用浏览器的默认设置,一般为utf-8。这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
(11)request.FILES:一个类似于字典的对象,包含所有的上传文件。

10.Django框架response

(1) HttpResponse
可以使用django.http.HttpResponse来构造响应对象。

Response(content=响应体, content_type=响应体数据类型, status=状态码)

也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:

  • content:表示返回的内容。
  • status_code:返回的HTTP响应状态码。
  • content_type:指定返回数据的的MIME类型。
    响应头可以直接将HttpResponse对象当做字典进行响应头键值对的设置。
response = Response()
response['Itcast'] = 'Python'  # 自定义响应头Itcast, 值为Python

(2)HttpResponse子类
Django提供了一系列HttpResponse的子类,可以快速设置状态码

HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500

(3)JsonResponse
若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 帮助我们将数据转换为json字符串
  • 设置响应头Content-Type为 application/json
from django.http import JsonResponsedef demo_view(request):return JsonResponse({
    'city': 'beijing', 'subject': 'python'})

(4)redirect重定向

11.Django REST framework框架(request)

REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。

(1)request.data 返回解析之后的请求体数据。类似于Django中标准的request.POST和 request.FILES属性,但提供如下特性:

  • 包含了解析之后的文件和非文件数据
  • 包含了对POST、PUT、PATCH请求方式解析后的数据
  • 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据

(2)request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。

12.Django REST framework框架(response)

rest_framework.response.Response

REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

REST framework提供了Renderer 渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。

REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类'rest_framework.renderers.JSONRenderer',  # json渲染器'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器)
}

构造方式

Response(data, status=None, template_name=None, headers=None, content_type=None)

data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器处理data。

data不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer序列化器序列化处理后(转为了Python字典类型)再传递给data参数。

参数说明:

data: 为响应准备的序列化处理后的数据;

  • status: 状态码,默认200;
  • template_name: 模板名称,如果使用HTMLRenderer 时需指明;
  • headers: 用于存放响应头信息的字典;
  • content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。

常用属性:
1).data
传给response对象的序列化后,但尚未render处理的数据

2).status_code
状态码的数字

3).content
经过render处理后的响应数据

  1. 状态码
    为了方便设置状态码,REST framewrok在rest_framework.status模块中提供了常用状态码常量。

1)信息告知 - 1xx

HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS

2)成功 - 2xx

HTTP_200_OK
HTTP_201_CREATED
HTTP_202_ACCEPTED
HTTP_203_NON_AUTHORITATIVE_INFORMATION
HTTP_204_NO_CONTENT
HTTP_205_RESET_CONTENT
HTTP_206_PARTIAL_CONTENT
HTTP_207_MULTI_STATUS

3)重定向 - 3xx

HTTP_300_MULTIPLE_CHOICES
HTTP_301_MOVED_PERMANENTLY
HTTP_302_FOUND
HTTP_303_SEE_OTHER
HTTP_304_NOT_MODIFIED
HTTP_305_USE_PROXY
HTTP_306_RESERVED
HTTP_307_TEMPORARY_REDIRECT

4)客户端错误 - 4xx

HTTP_400_BAD_REQUEST
HTTP_401_UNAUTHORIZED
HTTP_402_PAYMENT_REQUIRED
HTTP_403_FORBIDDEN
HTTP_404_NOT_FOUND
HTTP_405_METHOD_NOT_ALLOWED
HTTP_406_NOT_ACCEPTABLE
HTTP_407_PROXY_AUTHENTICATION_REQUIRED
HTTP_408_REQUEST_TIMEOUT
HTTP_409_CONFLICT
HTTP_410_GONE
HTTP_411_LENGTH_REQUIRED
HTTP_412_PRECONDITION_FAILED
HTTP_413_REQUEST_ENTITY_TOO_LARGE
HTTP_414_REQUEST_URI_TOO_LONG
HTTP_415_UNSUPPORTED_MEDIA_TYPE
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
HTTP_417_EXPECTATION_FAILED
HTTP_422_UNPROCESSABLE_ENTITY
HTTP_423_LOCKED
HTTP_424_FAILED_DEPENDENCY
HTTP_428_PRECONDITION_REQUIRED
HTTP_429_TOO_MANY_REQUESTS
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS

5)服务器错误 - 5xx

HTTP_500_INTERNAL_SERVER_ERROR
HTTP_501_NOT_IMPLEMENTED
HTTP_502_BAD_GATEWAY
HTTP_503_SERVICE_UNAVAILABLE
HTTP_504_GATEWAY_TIMEOUT
HTTP_505_HTTP_VERSION_NOT_SUPPORTED
HTTP_507_INSUFFICIENT_STORAGE
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
  相关解决方案