优秀的人,不是不合群,而是他们合群的人里面没有你
今天是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 模式。
好了一些简单的配置就到此为止,今天就学这么多吧~