# Start Up

**P.S. 以下命令都是在Linux下进行**

## 创建项目

在合适的文件夹下创建名字为 `mysite` 的项目，运行：

```bash
django-admin startproject mysite
```

会新建一个文件夹，文件树如下：

```
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
```

这些目录和文件的用处是：

* 最外层的 mysite/ 根目录只是你项目的容器， 根目录名称对Django没有影响，你可以将它重命名为任何你喜欢的名称。
* manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 django-admin and manage.py 获取所有 manage.py 的细节。
* 里面一层的 mysite/ 目录包含你的项目，它是一个**纯 Python 包**。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).
* mysite/**init**.py：一个空文件，告诉 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者，阅读官方文档中的 更多关于包的知识。
* mysite/settings.py：Django 项目的配置文件。如果你想知道这个文件是如何工作的，请查看 Django settings 了解细节。
* mysite/urls.py：Django 项目的 URL 声明，就像你网站的“目录”。阅读 URL dispatcher 文档来获取更多关于 URL 的内容。
* mysite/asgi.py：作为你的项目的运行在 ASGI 兼容的Web服务器上的入口。阅读 如何使用 WSGI 进行部署 了解更多细节。
* mysite/wsgi.py：作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。阅读 如何使用 WSGI 进行部署 了解更多细节。

> **可能会遇到的问题**：找不到 `django-admin` 是因为安装之后没有将 django 的bin 文件夹加入到环境变量中，比如我的 django 文件夹在 `/home/q2l/.local/lib/python3.6/site-packages/django` 下，我就要将其加入到我的环境变量，在我的 \~/.profile 中最后加入：
>
> ```bash
> export PATH="$HOME/.local/lib/python3.6/site-packages/django:$PATH"
> ```
>
> 表示在我自身的用户下生效

## 运行项目

在 `manage.py` 的目录下运行：

```bash
python manage.py runserver 8000
```

表示开始运行项目，后面的8000不是必填项，表示在本地开启的端口，默认为8000，可以自行修改

> 会自动重新加载的服务器 runserver 用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍 Python 代码。所以你**不需要为了让修改的代码生效而频繁的重新启动服务器**。 然而，一些动作，**比如添加新文件，将不会触发自动重新加载**，这时你得自己手动重启服务器。

## 创建应用

> 项目 VS 应用 **应用是一个专门做某件事的网络应用程序**——比如博客系统，或者公共记录的数据库，或者小型的投票程序。 **项目则是一个网站使用的配置和应用的集合**。项目可以包含很多个应用。应用可以被很多个项目使用。 “项目-应用”是数据库中一对多的关系。

在 `manage.py` 的目录下运行：

```bash
python manage.py startapp app_name
```

这样就创建了一个名字为 `app_name` 的应用，文件树结构为：

```
polls/
    __init__.py  // 标识是python程序
    admin.py // 管理员相关
    apps.py // 
    migrations/
        __init__.py
    models.py // MVC架构中的模型  
    tests.py // 测试
    views.py // MVC架构中的视图
```

### URL

在 `app_name` 目录下创建一个 `app_name/urls.py` 可以实现所有到 `app_name` 这个应用的url的映射，如：

```python
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

就是将视图下的 `index` 函数使用 `app_name/index` 来调用。

这里的path中有四个参数，分别是：

* [route](https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/#path-argument-route) &#x20;
  * route 是一个匹配 URL 的准则（类似正则表达式）。当 Django 响应一个请求时，它会从 urlpatterns 的第一项开始，按顺序依次匹配列表中的项，直到找到匹配的项。
  * 这些准则不会匹配 GET 和 POST 参数或域名。例如，URLconf 在处理请求 <https://www.example.com/myapp/> 时，它会尝试匹配 myapp/ 。处理请求 <https://www.example.com/myapp/?page=3> 时，也只会尝试匹配 myapp/。
  * 在上面的代码中。route这一项被置为''空字符串，表示不需要任何匹配，即默认页面就是 `index`。 &#x20;
* [view](https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/#path-argument-view) &#x20;
  * 当 Django 找到了一个匹配的准则，就会调用这个特定的视图函数，并传入一个 HttpRequest 对象作为第一个参数，被“捕获”的参数以关键字参数的形式传入。稍后，我们会给出一个例子。
* [kwargs](https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/#path-argument-kwargs) &#x20;
  * 任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。
* [name](https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/#path-argument-name)   &#x20;
  * 为你的 URL 取名能使你在 Django 的任意地方唯一地引用它，尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。&#x20;

在应用的 `urls.py` 中添加之后，为了能在网页上访问，还需要将应用的url加入到项目中，具体的添加方式是在 `mysite/urls.py` 中添加(\*)代码：

```python
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('app_name/', include('app_name.urls')),   # (*)
    path('admin/', admin.site.urls),
]
```

对于所有的应用的url，都使用 `include` 将其下所有的 url 包括进来，当项目的网站被请求时，遇到比如 `app_name/` 的关键词，会进入到 `app_name/urls.py` 中进行继续的匹配，然后渲染输出。

在上面可以看到两种不同的寻找方式：include 和 直接的 "." 拼接。 这里要说明：

> 当包括其它 URL 模式时你应该总是使用 include()，admin.site.urls 是唯一例外。

## Reference

1. [编写你的第一个 Django 应用，第 1 部分](https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/)
