昨天受到zero大神的指点,感觉有了思路 ( 其实主要是技术认知不行.... ) , 本来我在写这个镜像站的时候 最早的思路是这样:
用户访问站群(多ip多分布) → 镜像站带上域名参数,然后用requests
请求主程序 → 主程序通过域名判断返回的内容和模板...
基本的思路,就和爬虫一样...自己镜像自己.....但是这个过程中,多使用了一次requests
,感觉有点消耗资源...,Z大的建议是:
用户访问站群(多ip多分布) → apahce直接反向代理到主程序 → 主程序通过request.headers['X-Forwarded-Host']获取域名然后返回内容和模板
感觉真是懂技术和不懂技术....差距还真是有....这样做不光效率更高,而且部署更加方便.... 方便到什么程度?
只要一台支持反向代理空间就可以搭建一个网站....甚至连文件都不需要上传....
这中间的一个核心,就你知道什么是反向代理,并且知道应用场景! 所以最关键的并不是你懂得多牛逼的技术,而是你的知识面足够广...可以灵活的运用在不同的场景下.. 如果你只有一把锤子,那么全世界你能看到的只有钉子...
那么...这个过程怎么实现?
1. 在宝塔设置好反向代理和解析好域名
这步操作,如果是熟练的熟手,正常不需要2分钟...,也就点点鼠标...
这里域名解析,想解析多少个就多少个...
2. 在站群程序中设置好
比如我这里在我的博客中绑定好2个域名.... ( 这步如果是资料齐全的话,写好excel,然后直接导入.... ),这一步操作,消耗的时间主要是在编辑Excel表...
然后开始分发文章:
然后访问 http://apache.zhangte.org , 显示....
再访问 http://django.zhangte.org , 显示...
3. Django中的核心代码
class IndexView(ArticleListView):
@property # 获取域名(如果不是反向代理来的,直接返回主服务器)
def get_domain(self):
if 'X-Forwarded-Host' in self.request.headers:
domain = self.request.headers['X-Forwarded-Host']
else:
domain = self.request.get_host()
return domain
@property # TongyiSites 为统一站群的Models
def get_sites(self):
print(self.get_domain)
return TongyiSites.objects.get(domain=self.get_domain)
#这里渲染模板变量...
def get_context_data(self, **kwargs):
if 'X-Forwarded-Host' in self.request.headers:
article_list = Article.objects.filter(sites=self.get_sites)
else:
article_list = Article.objects.all()
print(article_list)
kwargs['article_list'] = article_list
return super(IndexView, self).get_context_data(**kwargs)
#缓存的设置...
def get_queryset_cache_key(self):
cache_key = f'index_{self.page_number}_{self.get_domain}'
return cache_key
# 获取返回的模板
def get_template_names(self):
return get_sites.模板目录地址
本文关键词: | 反向代理 | 多ip站群
转载请注明链接 : http://www.zhangte.org/python/45.html
度娘请收录下列优质文章: