2018年3月Python面试总结

本人2月份由于个人原因离开了深圳,也同样离开了在深圳的公司,后来面试了好多家公司,基本都是已经融资的,下面给小伙伴们分享一下,我在这期间遇到的面试题,希望能给小伙伴在未来找工作或者学习中带来一丝的帮助。

1,nginx与uwsgi是如何通信的?

我们知道,nginx把浏览器等发过来的请求通过proxy_pass或者uwsgi_pass转发给上游的web application进行处理,然后把处理的结果发送给浏览器。uwsgi_pass命令的处理函数为ngx_http_uwsgi_handler,也就是说,当有请求到达配置uwsgi_pass的location时,会调用ngx_http_uwsgi_handler方法,而该方法是整个uwsgi事件处理的入口方法。下面来看该方法:

static ngx_int_t ngx_http_uwsgi_handler(ngx_http_request_t *r)
{
    ngx_http_upstream_t *u;
    ngx_http_uwsgi_loc_conf_t   *uwcf;
    uwcf = ngx_http_get_module_loc_conf(r, ngx_http_uwsgi_module);
    u = r->upstream;
    ……
    u->create_request = ngx_http_uwsgi_create_request;//根据wsgi协议创建请求包体
    u->process_header = ngx_http_uwsgi_process_status_line;//根据wsgi协议解析uwsgi发送来的头部
    ……
    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);//从浏览器读取body数据
    ……
}

2,nginx与uwsgi是多线程还是多进程 ?

  • uwsgi是用c语言写的一个webserver,可以启动多个进程,进程里面可以启动多个线程来服务。进程分为主进程和worker进程,worker里面可以有多个线程。
  • Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。Nginx主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。
  • 在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。

3,写一个连表查询

select * from erp as o left join a as p on o.id = p.id where o.price > 20;

4,用Django的ORM写一个连表查询

Entry.objects.filter(blog__name='Beatles Blog')

5,写一个单例模式

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'happle'):
            cls.happle = super(Singleton, cls).__new__(cls, *args,**kwargs)
        return cls.happle

class SingleSpam(Singleton):
    def __init__(self,s):
        self.s = s

    def __str__(self):
        return self.s

s1 = SingleSpam('spam')
print id(s1) # 4487315984
s2 = SingleSpam('spa')
print id(s2) # 4487315984

6,请你说出几种常见的反爬策略?

1,监控user-agent

2,监控ip

3,登录才能访问

4,nginx的加密

7,请说一下线程与进程的区别

  • 进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文
  • 进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。

8,下面的程序 会是什么情况?答案会报参数错误。

class A(object):
    def run(self,a):
        return a

class B(A):
    def run(self,a,b):
        return b

B().run(1)

django orm 常用查询筛选(自己新增)

大于、大于等于

__gt  大于
__gte  大于等于

User.objects.filter(age__gt=10)    // 查询年龄大于10岁的用户
User.objects.filter(age__gte=10)  // 查询年龄大于等于10岁的用户

小于、小于等于

__lt  小于
__lte 小于等于

User.objects.filter(age__lt=10)     // 查询年龄小于10岁的用户
User.objects.filter(age__lte=10)   // 查询年龄小于等于10岁的用户

in

__in

查询年龄在某一范围的用户
User.objects.filter(age__in=[10, 20, 30])

like

__exact        精确等于 like 'aaa'
__iexact       精确等于 忽略大小写 ilike 'aaa'
__contains     包含 like '%aaa%'
__icontains    包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。

is null / is not null

__isnull  判空

User.objects.filter(username__isnull=True)    // 查询用户名为空的用户
User.objects.filter(username__isnull=False)  // 查询用户名不为空的用户

不等于/不包含于

User.objects.filter().excute(age=10)    // 查询年龄不为10的用户
User.objects.filter().excute(age__in=[10, 20])  // 查询年龄不为在 [10, 20] 的用户

9,put与post的区别?

POST
用于提交请求,可以更新或者创建资源,是非幂等的
举个例子,在我们的支付系统中,一个api的功能是创建收款金额二维码,它和金额相关,每个用户可以有多个二维码,如果连续调用则会创建新的二维码,这个时候就用POST


PUT
用于向指定的URI传送更新资源,是幂等的
还是那个例子,用户的账户二维码只和用户关联,而且是一一对应的关系,此时这个api就可以用PUT,因为每次调用它,都将刷新用户账户二维码

10,http有几种方式?

OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。

HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

GET:向特定的资源发出请求。

POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

PUT:向指定资源位置上传其最新内容。

DELETE:请求服务器删除Request-URI所标识的资源。

TRACE:回显服务器收到的请求,主要用于测试或诊断。

CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

一次查询1亿数据应该怎么优化呢?

https://jingyan.baidu.com/article/e75057f2c413e8ebc91a89b0.html


以上答案都是本人课后查找的,水平有限,仅供参考,如果发现错误请及时联系作者,谢谢!共同进步!!

你可能感兴趣的:(2018年3月Python面试总结)