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