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来指向就好了,避免错误。

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

{#<a href="{% url 'blog:list' %}">进入BLOG列表</a>#}
<h4><a href="{% host_url 'list' host 'blog' %}">进入BLOG列表(django-hosts)</a></h4>
注意:任何与该App有关的用过host_url的模板中,都不能出现Django中的url

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多个子应用程序放置在一个名为 `apps` 的目录中是一种常见的 Django 应用程序组织方式。在这种情况下,需要在 `settings.py` 文件中进行一些配置。 首先,您需要在 `INSTALLED_APPS` 中列出每个应用程序的名称。通常,您可以使用 `.` 来指定应用程序的路径。例如,如果您的应用程序位于 `apps.blog` 中,则可以将其添加到 `INSTALLED_APPS` 中: ```python INSTALLED_APPS = [ # ... 'apps.blog', 'apps.comments', # ... ] ``` 接下来,您需要告诉 Django 在哪里查找应用程序的模板文件。在 `TEMPLATES` 中,您可以为每个应用程序添加一个模板文件夹路径。例如,如果您的应用程序的模板文件存储在 `apps/blog/templates` 和 `apps/comments/templates` 中,则可以将其添加到 `TEMPLATES` 中: ```python TEMPLATES = [ { # ... 'APP_DIRS': True, 'DIRS': [ # ... os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'apps', 'blog', 'templates'), os.path.join(BASE_DIR, 'apps', 'comments', 'templates'), ], # ... }, ] ``` 在这个示例中,`APP_DIRS` 被设置为 `True`,这表示 Django 将在每个应用程序中查找模板文件夹。此外, `DIRS` 列表中包含了所有应用程序的模板文件夹路径,以及项目级别的模板文件夹路径。 最后,您需要将每个应用程序的静态文件存储在一个单独的文件夹中。在 `STATICFILES_DIRS` 中,您可以为每个应用程序添加一个静态文件夹路径。例如: ```python STATICFILES_DIRS = [ # ... os.path.join(BASE_DIR, 'apps', 'blog', 'static'), os.path.join(BASE_DIR, 'apps', 'comments', 'static'), ] ``` 以上是将多个子应用程序放置在一个名为 `apps` 的目录中的 Django 配置方法。希望能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值