Django将多个app解析到不同的域名(二级域名)并共用数据库

Django将多个app解析到不同的域名(二级域名)并共用数据库,第1张

Django将多个app解析到不同的域名(二级域名)并共用数据库 最近在开发网站过程中遇到了一个令我头疼的问题: 目标对于一个django项目,需要开发另外域名的版本环境ubuntu nginx + uwsgi 我的解决办法:

新建一个django项目,然后利用nginx和uwsgi解析到我需要的二级域名就好了,但是这个新网站的数据是不变的,也就是说还要使用之前的数据库,可这样跟以前就是两个项目,我不能直接import之前的models,而数据库又比较大复杂,重新建库不现实,我也可以直接使用MySQldb,就像这样:

import MySQLdb
 
def book_list(request):
  db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
  cursor = db.cursor()
  cursor.execute('SELECt name FROM books ORDER BY name')
  names = [row[0] for row in cursor.fetchall()]
  db.close()
  return render_to_response('book_list.html', {'names': names})

但是考虑了一下这样太不方便了,每次都要连接查询,不合适我的需求。
又在网上找了半天,幸好看到有人说django-host,很是符合,接下来记录一下具体使用过程:

django的第三方扩展包django-hosts的安装使用,github地址

安装
pip install django-hosts
django manage.py startapp api #域名api.example.com
django manage.py startapp beta #域名beta.example.com
配置

在项目settins.py的同级目录下新建文件hosts.py:

from django_hosts import patterns, host

host_patterns = patterns('path.to',
    host(r'api', 'api.urls', name='api'),
    host(r'beta', 'beta.urls', name='beta'),
)

打开项目setting.py,

1,在INSTALLED_APPS添加:'django_hosts'
2,在MIDDLEWARE添加:
'django_hosts.middleware.HostsRequestMiddleware'
......
'django_hosts.middleware.HostsRequestMiddleware'
#要在middleware最开始和最后都添加
3,在ROOT_URLCONF后添加:
 ROOT_HOSTCONF = '项目名.hosts' 
 DEFAULT_HOST='api(或者beta)' #这是设置的默认域名,即在未匹配到正确的二级域名时,默认跳转到此,但这必须是在host.py中设置好的才能找到。
PARENT_HOST = 'example.com' #在呈现的URL的域部分附加一个默认域名

接下来处理各个app的url,打开项目的urls.py:

from django.contrib import admin
from django.urls import path, include
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('www.urls', namespace='www')),
    path('api/', include('api.urls', namespace='api')),
    path('beta/', include('beta.urls', namespace='beta')),
]

api的urls.py:

from django.urls import path
from .views import index
 
app_name = 'api'
 
urlpatterns = [
    path('', index, name='index'),
]

beta的urls.py:

from django.urls import path
from .views import index
 
app_name = 'beta'
 
urlpatterns = [
    path('', index, name='index'),
]
配置nginx

找到nginx的配置文件添加

server {
    listen 80;
    server_name api.example.com;
    location / {
           proxy_pass   http://127.0.0.1:8080/;       
        }
}

server {
    listen 80;
    server_name beta.example.com;
    location / {
           proxy_pass   http://127.0.0.1:8080/;       
        }
}

保存后重新载入:

nginx -s reload

uwsgi还使用之前的即可,无需更新。

html问题

使用了django-hosts后html会报错:

使用Django的URL template tag会报错:
u'xxx' is not a registered namespace
所以我直接用具体的url来指向就好了,避免错误。

查到一篇文章,链接,是这样解决的:

{#进入BLOG列表#}
进入BLOG列表(django-hosts)
注意:任何与该App有关的用过host_url的模板中,都不能出现Django中的url

但是我试了没成功,可能哪里有错误,就直接用url了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4992528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存