优秀的人,不是不合群,而是他们合群的人里面没有你

今天是2019/07/03,上个月准备了段里的考试,背了一个月的题库,都没怎么研究学习WEB,如今暂时缓和下来,立一个Flag,争取在7月份一个月之内学会使用Django,不求达到完全掌握的程度,至少要完全熟悉功能,写几个漏洞扫描器系统管理平台。

安装

这里使用Django2.1.0版本,该版本比较稳定并且有最新的官方文档~

下载地址

官方文档

安装完后,在cmd下输入

python3 -m django --version

如果返回django的版本号,则说明安装成功

创建项目

安装好Django后,创建新的项目或者应用都是使用自带的命令执行,这些都是规定好的,优点是不需要自己重新设计,缺点嘛,就是要背的命令变多了,不过这都不是事

新建一个文件夹,用来保存你的Django项目

使用命令

django-admin startproject Your_Project_Name

然后就会发现目录下生成了一些文件

Your_Project_Name/ # 你存放项目的文件夹
    manage.py      # 命令行工具,可以用来启动Django,等等做很多事
    Your_Project_Name/ # 目录是真正的项目文件包裹目录,它的名字是你引用内部文件的包名
        __init__.py       # 定义包的空文件
        settings.py       # 项目的主配置文件
        urls.py           # 路由管理,相当于Flask中自己写的app.route('/'),不过这里统一管理,很方便
        wsgi.py           # 基于WSGI的web服务器进入点,提供底层的网络通信功能

注意,这里生成的文件都是你的项目文件,你的项目其下还有许多的功能,这里Flask中需要你自己分文件夹,然后使用蓝图管理不同功能的路由映射,数据库管理。

但是Django把你帮你把一切都安排的明明白白,项目就是项目,自己生成项目相关的配置文件,每个应用就是每个应用,自己创建每个功能应用,自动生成功能应用的配置文件。

有点绕,其实就是你项目中的每个功能,独立实现独立分块,方便管理。这些功能引用也需要使用命令行生成。

比如你的项目下有个登陆功能,暂且把这个登陆的模块名叫做login,这个登陆的应用需要你使用命令生成然后进行配置,首先到你创建项目的文件夹下面,使用命令

python3 manage.py startapp login

然后会发现生成了一堆的文件

login/        # 该登陆模块的文件夹
    __init__.py # 包空文件
    admin.py    # 自动生成强大的后台管理文件
    apps.py        # 功能类似单个项目设置文件,具体我不清楚,等后期慢慢查
    migrations/ # 这个文件夹用来操作管理数据库的数据,可以做数据库的迁移之类
        __init__.py # 不解释不解释,解释就是掩饰
    models.py    # 用来生成数据库的文件,和Flask中的modules.py一毛一样呢
    tests.py    # 用来做测试代码的文件,啊,真是贴心呢
    views.py    # 就像Flask中的视图函数,不过这里专门分了一个文件让你写视图函数

还有什么其他的应用模块啦,生成命令也是和上面一样的,果然是很贴心呢

启动服务

像Flask中是需要你写好文件然后运行文件才会启动,这里Django贴心的提供命令行启动模式

使用命令

python3 manage.py runserver
# 启动,默认端口8000
python3 manage.py runserver 8080
# 启动,使用8080端口
python3 manage.py runserver 0:8080
并且修改文件settings.py
ALLOWED_HOSTS = ['*',]
# 启动,监听所有人的访问,即允许所有人访问

编写视图

在你创建的login登陆模块的views.py文件中,可以开始写一些视图功能了。

views.py

from django.http import HttpResponse
# 这里和Flask中生成Response功能一样,需要背一背

def index(requests):
    # 这里函数接受的参数必须有,名字可以随便,不过默认都是requests
    return HttpResponse('浪子666,恭喜恭喜')

def error(requests):
    return HttpResponse('外星人入侵啦')

urls.py

在你创建的login功能项目中,是没有urls.py这个文件的。

为什么要创建这个urls.py呢?虽然你的项目的根目录下有个urls.py,你完全可以在根目录的urls.py文件写url路由映射啊,后来我想到了,为了分块独立!低耦合高内聚,哈哈哈方便管理,话说官方文档真是贴心呢

from django.urls import path
# 这个path函数的功能比较重要,最下面会说
from .views import index,error
# 从视图函数文件中导入创建的两个视图函数

urlpatterns = [
    path('', index, name='index'),
    # 这里第一个是网址路由,第二个是视图函数,第三个是视图函数指定的名称,可以在任何地方使用这个名称调用这个视图函数
    # 哇塞,真实贴心实用呢
    path('error/', error, name='error')
    # 这个的url目录就是error啦
]

根目录下的urls.py

在根目录下的urls.py文件中,注册你login模块下的urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/',include('login.urls'))
    # 这里指定的url目录为login,包含使用的是login目录下的urls的视图
]

然后启动项目

python3 manage.py runserver

返回HTML文件

就像Flask中render_templates(希望没背错)的功能一样,Django中也可以这么做,但是需要一点点小小的配置

首先在你的项目根目录创建一个文件夹,文件夹命名tamplates,然后在这个文件夹随便创建一个html文件,命名为index.html吧

然后在login模块的views.py文件中,就可以直接使用渲染了哦

from django.shortcuts import render
# 这个就是渲染html模板的函数啦

def index(requests):
    # 这里函数接受的参数必须有,名字可以随便,不过默认都是requests
    return render(requests,'index.html')
    # 这里render接受的第一个参数必须是requests,第二个是templats文件夹中的html名字

然后还需要做一些小小的设置,就相当于Flask中指定你的templats文件夹一样,在根目录下的settings.py文件

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        # 只有这一行才是我们需要设置的,基本上设置成这样就ok
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

然后就ok啦

使用静态文件

和Flask中一样,使用static文件夹保存一些js,css,img文件….

这里只需要做一些小小的设置就能直接上手使用,真是非常贴心呢

首先在根目录创建一个static文件夹,然后再这个static文件夹新建一个image文件夹

然后再根目录下面的settings.py中,

在底部添加:

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(os.path.join(BASE_DIR, 'static')),
)

设置html

{% load static %}
#这句添加在html文件的最上面  

# 然后在需要的地方按照这个格式进行调用,如:
<img src="{% static 'image/404.jpg' %}"/>  

添加访问计数

使用第三方busuanzi进行计数

在公共的html文件中引入第三方js

<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

然后再底部添加如下html代码即可

统计站点pv

<span id="busuanzi_container_site_pv">
    本站总访问量<span id="busuanzi_value_site_pv"></span>次
</span>
统计站点uv

<span id="busuanzi_container_site_uv">
  本站访客数<span id="busuanzi_value_site_uv"></span>人次
</span>
统计页面pv

<span id="busuanzi_container_page_pv">
  本文总阅读量<span id="busuanzi_value_page_pv"></span>次
</span>

如果需要展示统计数据,只需要使用一个 div 然后把它的 id 设置成上边中的一个就好。

数据库

Django前期自带的sqlite挺不错的,嘻嘻

创建数据库模型

在login模块的models.py中,可以像falsk中的sqlalchemy一样,使用orm模型操作数据库。

有flask的底子学django真是友好

在login中的models.py文件中,创建数据库模型

from django.db import models
class UserInfo(models.Model):
    user = models.CharField(max_length=10)
    # 字符串类型,最大长度为10
    age = models.CharField(max_length=3)
    password = models.CharField(max_length=100)

创建数据库

既然要使用数据库,那么就像使用渲染html一样,得先去注册一下,回到根目录下的settings.py中,修改 INSTALLED_APPS

修改成

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'login'
    # 把你的模块保存到这里就ok
]

然后在根目录下执行命令

python3 manage.py makemigrations

这会在login目录中的migrations目录中生成一个0001_initial.py迁移记录文件。

再输入命令:

python3 manage.py migrate

然后会发现所有app的数据表都创建好了。我们可以看到项目根目录下出现了一个db.sqlite3文件

最后附上一张文件结构图

PATH函数功能

path() 参数: route

route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。

这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/。

path() 参数: view

当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。稍后,我们会给出一个例子。

path() 参数: kwargs

任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。

path() 参数: name

为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。

好了一些简单的配置就到此为止,今天就学这么多吧~