资讯专栏INFORMATION COLUMN

Django 项目配置初体验(一)

Wildcard / 1424人阅读

摘要:静态资源路径可以有多个,所以这里使用一个列表进行配置再次进入,完美后记现在只涉及到了项目的配置和一些基础的配置,没有涉及到请求从开始到完成的任何内容。下篇教程将集中进行记录。

前言

推荐使用 virtualenv 创建 python 虚拟环境,防止因为使用 pip 安装依赖到全局引起版本冲突的问题,PyCharm 默认会生成一个 venv 目录并创建虚拟环境,使用 IDE 自带的终端也会默认激活虚拟环境

使用的教程基于 Django 1.9.8,现在 Django 已经升级到了 2.0.3,所以可能会有部分写法不太常见

涉及到的知识:

初始化项目

注册项目

database 配置

生成 Django 默认表,没有配置 model

view 和 template 配置

url 配置(包括配置 name)

静态文件路径配置

基础环境

Pycharm 2018

Django 2.0.3

Python 3.6.4

mxonline start 分支

Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台

目录结构 初始结构

直接采用 PyCharm 初始化一个 Django 项目

.
├── db.sqlite3        # 默认的 sqlite 数据库文件
├── manage.py         # 启动脚本
├── mxoline           # 主要配置存放路径
│   ├── __init__.py
│   ├── settings.py   # 全局配置
│   ├── urls.py       # url 配置文件
│   └── wsgi.py
└──  templates        # html 文件模板
新建 app
$ django-admin startapp message

生成的 app 结构:

└── message          
    ├── __init__.py  
    ├── admin.py     
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

新建其他目录

log:存放 log 日志

static:存放静态资源

media:存放用户上传的媒体文件

最终的项目结构

防止项目过大的时候,app 过多难以管理

.
├── apps                 # app 集中存放,防止当项目规模变大难以管理
│   └── message          # 新建的 message app
├── db.sqlite3           # 默认的 sqlite 数据库
├── log                  # 存放 log 日志
├── manage.py            # 启动脚本
├── media                # 用户上传的媒体文件
├── mxoline              # 项目主要配置目录
│   ├── __init__.py      # 初始化文件
│   ├── __pycache__      # 
│   ├── settings.py      # django 框架全局配置文件
│   ├── urls.py          # url 映射关系配置文件
│   └── wsgi.py          # 
├── static               # 静态资源文件
├── templates            # 模板存放目录
└── venv                 # PyCharm 创建的虚拟 Python 环境
    ├── bin
    ├── include
    ├── lib
    ├── pip-selfcheck.json
    └── pyvenv.cfg
项目初体验 注册项目

每次创建一个 App,我们都需要在 settings.py 中进行注册:

# {BASE_DIR}/mxonline/settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "apps.message"
]

可以看到在列表中添加了 message 项目。

配置数据库

默认使用的是 sqlite,我们在这里使用 mysql(有坑预警,昨天晚上查了好久)

进入 setting 文件,默认的配置情况是这个样子的:

# {BASE_DIR}/mxonline/settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
    }
}

修改成这个样子:

# {BASE_DIR}/mxonline/settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",  # 使用mysql引擎
        "NAME": "test_django",                 # 数据库名称
        "USER": "root",                        # 用户
        "PASSWORD": "root",                    # 密码
        "HOST": "127.0.0.1"                    # 地址
    }
}

然后需要安装 mysql 的驱动,mac 下会出现装不上的情况,具体可以参考这里,自行修改 mysql-config 文件。

# 这里是 mac 的驱动,使用Windows 同学对不起啊。
$ pip install mysqlclient

Windows 上需要自行下载 mysql-python 驱动,好像也挺多坑的,按下不表。

生成数据表

Pycharm 中,点击 Tools 中的 Run manage.py Task,然后就可以在里边快捷的运行 manage.py 提供的各种脚本了。

如果在命令行中运行的话,需要在下面的命令前边加上 python manage.py

$ makemigrations
$ migrate

输出大概如下:

bash -cl "/Users/zhoubao/workplace/python/mxoline/venv/bin/python /Applications/PyCharm.app/Contents/helpers/pycharm/django_manage.py migrate /Users/zhoubao/workplace/python/mxoline"
(B[mTracking file by folder pattern:  migrations
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK

可以登录自己的 mysql 数据库查看一下是不是生成了一堆数据表:

$ mysql -uroot -proot
$ change test_django
$ show tables;

我这里的输出是这个样子的:

+----------------------------+
| Tables_in_test_django      |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)

当然可以使用 Navicat 进行查看,这里就不截图了。

查看欢迎页面
runserver

然后可以访问 127.0.0.1:8000,查看是否进入了 django 的默认欢迎页面。

新建 templates

先在 templates 中添加一个 form.html 文件(也算是懒到家了,就直接用 curl 拉取了)

$ cd templates
$ curl -L https://raw.githubusercontent.com/missxiaolin/python-django/1860df7790a5daefafd2c052c1e3afedbbc48151/templates/mesage_form.html > message_form.html
在 app 中新建 view

在这里指定 view 和 template 的关系,默认的 templates 目录就是 {BASE_DIR}/templates

# {BASE_DIR}/apps/message/views.py
from django.shortcuts import render


def getForm(request):
    return render(request, "message_form.html")
为 template 创建 url 映射

目的是将刚才的 form.html 页面呈现出来。

进入生成项目的时候生成的和项目名称相同的那个目录下边的 urls.py 文件中,和 settings.py 文件同级,文件已经配置好了 /admin 路由:

# {BASE_DIR}/mxonline/urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path("admin/", admin.site.urls),
]

需要添加自己的配置项,这里和 1.9.8 不太一样,不需要使用正则,正则对应的是 re-path

# {BASE_DIR}/mxonline/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("message.urls"))
]
app 内部维护 url 文件

这里的处理方式和教程中的不太一样,首先教程基于的是 Django 的 1.9.8 版本,配置路由需要使用到正则表达式相关的知识。其次教程在这里对 app 中的 url 进行了处理,我选择的方式则是在 app 自己的目录中维护自己的 url。

$ cd apps/message
$ touch urls.py
# {BASE_URL}/apps/message/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("", views.getForm, name="go_form")
]

在这里可以指定一个 name 参数,这个参数在后边会非常有用,因为在 template 中可以通过 name 来指定 url

解决模块引用问题

在配置完成 url 之后,运行 runserver 之后(或者在命令行中运行 python manage.py runserver),会报错:

ModuleNotFoundError: No module named "message"

意思是找不到名字叫 message 的这个模块。

因为我们的 message app 之前已经被我们放到了 apps 目录下,所以我们的解决方法会有两种:

不更改 settings.py

如果不想要修改 settings.py 的话,我们在每次引用 apps 下面的应用的话,需要指定路径。所以修改文件如下:

# {BASE_DIR}/mxonline/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("apps.message.urls"))
]

这样虽然能用,但是每次都需要写 apps,不太方便。

将 apps 设置为模块路径

这样 Django 就会在 apps 中去寻找 message 模块(app)了:

# {BASE_DIR}/mxonline/settings.py
import sys
sys.path.insert(0, os.path.join(BASE_DIR, "apps"))

这里我选择的是第二种处理方式。

这样我们点击进去 127.0.0.1:8000 就应该能看到 message_form.html 页面文件了。

解决 CSS 路径不正确的问题

在进入页面的时候,我们会发现 css 文件的路径不正确,所以需要在 settings.py 文件中设置 static 路径。

静态资源路径可以有多个,所以这里使用一个列表进行配置:

# {BASE_DIR}/mxonline/settings.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,"static")
]

再次进入 127.0.0.1:8000,完美~

后记

现在只涉及到了项目的配置和一些基础的配置,没有涉及到 Django 请求从开始到完成的任何内容。下篇教程将集中进行记录。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41443.html

相关文章

  • Celery实际使用与内存泄漏问题(面试)

    摘要:结论执行完任务不释放内存与原一直没有被销毁有关,因此可以适当配置小点,而任务并发数与配置项有关,每增加一个必然增加内存消耗,同时也影响到一个何时被销毁,因为是均匀调度任务至每个,因此也不宜配置过大,适当配置。 1.实际使用 ​ 监控task的执行结果:任务id,结果,traceback,children,任务状态 ​ 配置 backend=redis://127...

    0x584a 评论0 收藏0
  • [] Ruff之体验

    摘要:实现项目的配置初始化,这个有些像我们在写模块的时候初始化配置,其实这里也是在初始化项目配置。 引言 首先简单说一下Ruff,Ruff是一个JavaScript运行时,专门为开发硬件而设计,其底层实现是基于Node.js,让我们可以使用JavaScript语言去实现自己想要的硬件功能设计,下面就是从零开始接触和学习使用Ruff showImg(https://segmentfault.c...

    Youngdze 评论0 收藏0
  • 利用 NGINX 最大化 Python 性能,第部分:Web 服务和缓存

    摘要:无论是将其用作的服务器反向代理服务器负载均衡器,还是同时使用以上三种功能,和都能带来很大好处。再就是下篇文章会介绍如何把和当作反向代理服务器和多个应用程序服务器的负载均衡器。而使用将会有助于解决这一问题。 【编者按】本文主要介绍 nginx 的主要功能以及如何通过 NGINX 优化 Python 应用性能。本文系国内 ITOM 管理平台 OneAPM 编译呈现。 Python 的著名之...

    1treeS 评论0 收藏0
  • 利用 NGINX 最大化 Python 性能,第部分:Web 服务和缓存

    摘要:无论是将其用作的服务器反向代理服务器负载均衡器,还是同时使用以上三种功能,和都能带来很大好处。再就是下篇文章会介绍如何把和当作反向代理服务器和多个应用程序服务器的负载均衡器。而使用将会有助于解决这一问题。 【编者按】本文主要介绍 nginx 的主要功能以及如何通过 NGINX 优化 Python 应用性能。本文系国内 ITOM 管理平台 OneAPM 编译呈现。 Python 的著名之...

    v1 评论0 收藏0
  • 【个人】微信小程序体验

    摘要:准备工作开发工具下载地址竟然隐藏在一个超链接里,真的很不醒目啊文档地址初次体验新建项目的时候,可以选择是小程序小游戏,这次我体验的是小程序的开发。可以配置小程序边界的,如顶部的导航栏的一些样式。 很早前就想体验一把小程序的开发了,如果熟悉三大框架的话,小程序的开发还是很容易上手的,所以只要跟着做一个小应用,加上官方的文档就十分好学了。加上官方提供的开发工具也比较简洁好用,初次体验的我觉...

    894974231 评论0 收藏0

发表评论

0条评论

Wildcard

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<