django 中的三层架构:视图(控制层),数据模型,模板(视图层)
客户端浏览器发送请求 ——> 视图(接收请求,业务处理) ——> 数据模型 ——> 数据库 ——> 数据模型 ——> 视图 ——> 模板 ——> 视图 ——> 客户端
已经安装好了 python ,检查方法:输入 python 显示版本信息。
1、在桌面新建一个文件夹例如:dj_base.
2、进去该文件夹输入命令安装虚拟环境:C:\Users\Administrator\Desktop> python -m venv dj_base 成功以后文件夹里面便会有一下文件。
3、激活 输入命令 cd dj_base/Scripts/activate 激活之后便会看见,前面多了 (dj_base)
4、安装 django 本次安装版本 2.2.5,选择国内的镜像
(dj_base) C:\Users\Administrator\Desktop>pip install django==2.2.5 -i https://pypi.douban.com/simple
5、检查安装结果,import django django.__version__ 可以查看到版本。
6、创建一个项目名称为: bookmanager
(dj_base) C:\Users\Administrator\Desktop>django-admin startproject bookmanager
在桌面出现项目文件夹
工程总目录与内部文件夹的名称是一样的,都是 bookmanager
manage.py python可执行文件:内置一些django的命令
关于项目内部bookmanager文件夹中的文件说明:
__init__.py 当前文件夹是一个模块
settings.py django中的配置文件 例如:数据库、缓存、中间件、语言等
urls.py 路由文件:大家在访问网站时使用的网址
wsgi.py 网关系统:在互联网中可以被其他计算机访问的文件
7、运行该项目,进入工程总目录下输入命令 python manage.py runserver
7-1 在pycharm 中运行项目
1、在 pycharm; 中打开项目,点击 Edit Configurations
2、设置地址和端口
3、点击运行即可
Django的基础命令
1.django-admin startproject 项目名:创建一个django项目
2.python manage.py startapp 应用名:项目中创建一个应用
3.python manage.py shell:进入调试代码的调试模式
4.python manage.py makemigrations:数据库创建更改文件
5.python manage.py migrate:同步到数据库进行更新
6.python manage.py flush:清空数据库
7.python manage.py runserver 0.0.0.0:8000:启动开发服务器(内置的单线程具有阻塞特性的服务器它不能支持高并发,只是用作测试,在实际工作中严令禁止通过开发服务器部署项目)
8.python manage.py 回车:可查看更多命令
二、创建项目子应用
1、创建子应用:python manage.py startapp + 应用名
例如:python manage.py startapp index
创建成功如图:
admin.py 文件跟网站的后台管理站点配置相关。
apps.py 文件用于配置当前子应用的相关信息。
migrations 目录用于存放数据库迁移历史文件·
models.py 文件用户保存数据库模型类。
tests.py 文件用于开发测试用例,编写单元测试。
views.py 文件用于编写Web应用视图。
2、用 pycharm 打开项目文件夹,setting 中 配置环境,可点击 “ + ”号选择环境目录文件,我们这里的文件目录为:C:\Users\Administrator\Desktop\dj_base\Scripts\python.exe
3、注册子应用 index
settings.py 说明
# 返回一个项目的绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 数据加密 防止网站跨域攻击
SECRET_KEY = 'd5tsvvss^(&_jgvdo3lf_2_&pvs=3j(55d3oug&#t5y*-i^+(%'
# 让网站处于开发模式
DEBUG = True
# 允许访问网站的白名单,例如写上 ip 地址,或者允许所有的访问 写上通配符: ’*‘
ALLOWED_HOSTS = []
# 子应用注册(新创建的子应用要在这里注册)
INSTALLED_APPS = []
# 中间件
MIDDLEWARE = []
# 网站入口根路由配置
ROOT_URLCONF = 'bookmanager.urls'
# 配置 html 静态文件
TEMPLATES = []
# 配置开发服务器
WSGI_APPLICATION = 'bookmanager.wsgi.application'
# 配置数据库
DATABASES = {}
# 用户密码加密
AUTH_PASSWORD_VALIDATORS = []
# 网站默认语言
LANGUAGE_CODE = 'zh-hans'
# 网站的默认时间
TIME_ZONE = 'Asia/Shanghai'
4、在子应用的 views.py 创建一个函数
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello django')
5、在子应用 index 文件夹下创建子路由文件 urls.py ,因为项目可能比较大,一般不去动根路由。
from django.urls import path
from .views import hello # 导入视图函数
urlpatterns = [
path('',hello),
]
6、在根路由中导入子路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('index.urls')) # 导入子路由
]
7、运行该项目,效果如下:
三、url 传参
第一种:
1、新建一个子应用 urlPassValue,创建子应用的方法同上。
2、编辑视图 views.py
from django.http import HttpResponse
# Create your views here.
def urlpassvalue(request):
name = request.GET.get('name','')
age = request.GET.get('age',10)
return HttpResponse('路由传参的第一种')
3、创建子路由,新建 urls.py 文件
from django.urls import path
from .views import urlpassvalue
urlpatterns = [
path('upv',urlpassvalue),
]
4、根路由中引入子路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('index.urls')),
path('',include('urlPassValue.urls')), # 引入 url 传参示例的子应用
]
5、运行项目,打开浏览器 在网址后面输入:upv?name=guan&age=10 运行效果:
第二种:与第一种不同的地方在
1、views.py
from django.http import HttpResponse
# Create your views here.
def urlpassvalue(request,name,age):
return HttpResponse('路由传参的第二种')
2、urls.py
from django.urls import path
from .views import urlpassvalue
urlpatterns = [
path('upv/<str:name>/<int:age>',urlpassvalue),
]
输入 upv/guan/10 效果:
三、views 详细介绍
1、创建一个应用 python manage.py startapp firstview
2、 views.py
def message(request):
print(dir(request))
return HttpResponse('request是浏览器传过来的参数')
3、在应用中创建子路由,根路由中引入子路由,setting中注册子应用此处略过,最后运行如下图所示。
3.1 request 中的方法:
['COOKIES', 'FILES', 'GET', 'META', 'POST', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_current_scheme_host', '_encoding', '_get_full_path', '_get_post', '_get_raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files', '_mark_post_parse_error', '_messages', '_read_started', '_set_post', '_stream', '_upload_handlers', 'body', 'build_absolute_uri', 'close', 'content_params', 'content_type', 'csrf_processing_done', 'encoding', 'environ', 'get_full_path', 'get_full_path_info', 'get_host', 'get_port', 'get_raw_uri', 'get_signed_cookie', 'headers', 'is_ajax', 'is_secure', 'method', 'parse_file_upload', 'path', 'path_info', 'read', 'readline', 'readlines', 'resolver_match', 'scheme', 'session', 'upload_handlers', 'user', 'xreadlines']
1.request.GET 获取url上以?形式的参数
2.request.POST 获取post提交的数据
3.request.path 请求的路径,比如:127.0.0.1/test/l,那这个值就是/test/1
4.request.method 请求的方法比如:get post
5.request.COOKIES 请求过来的cookies
6.request.user 请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
7.request.session 一个既可读又可写的类似与字典的对象,表示当前会话
8.request. META一个标准的Python字典,包含所有的HTTP首部,具体的头部信息取决与客户端和服务器。
3.2 常用的返回对象
from django.http import HttpResponse
HttpResponse 可以直接返回一些字符串内容
from django.shortcuts import render
render 将数据在模板中渲染并显示
from django.http import JsonResponse
JsonResponse 返回一个json类型 通常用于与前端进行ajax交互
4、通过类创建视图对象
views.py
# 通用视图
from django.views.generic import View
# 通过类创建视图
class Message(View):
def get(self,request):
return HttpResponse('通过类创建视图')
urls.py
from django.urls import path
from .views import Message
urlpatterns = [
path('message/',Message.as_view())
]
运行结果:
5、小案例,获取浏览器输入的值
5.1 views.py
from django.views.generic import View
# 通过类创建视图
class Message(View):
def get(self,request):
name = request.GET.get('name','默认值')
age = request.GET.get('age',10)
return HttpResponse('My name is {}, my age is {}'.format(name,age))
5.2 urls.py
from django.urls import path
from .views import Message
urlpatterns = [
path('message',Message.as_view())
]
运行结果:
四:模板 template 介绍
1、创建一个子应用 template
python manage.py startapp template
2、在根目录下新建 templates 文件夹
3、在 templates 文件夹新建一个 index.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>template</title>
</head>
<body>
<p>
这是{{name}}的第一个 template 文件
</p>
</body>
</html>
4、编辑子视图 views.py
# 返回一个HTML页面
from django.shortcuts import render
# 通用视图
from django.views.generic import View
# 通过类创建视图
class Template(View):
def get(self,request,name):
return render(request,'index.html',{'name':name})
5、编辑子路由 urls.py
from django.urls import path
from .views import Template
urlpatterns = [
path('template/<str:name>',Template.as_view())
]
6、在根路由中引入子路由
7、在setting 中注册子路由和配置静态文件
8、运行项目输入网址 python manage.py runserver
template 内置标签
{% for %}{% endfor %} 遍历输出的内容
{% if %}{% elif %}[% endif %}对变量进行条件判断
{% url name args %} 引用路由配置名
{% load %} 加载django的标签库
{% load static %}
{% static static_path %} 读取静态资源
{% extends base_template %} 模板继承
{% block data %}{% endblock %} 重写父模板的代码
{% csrf_token %} 跨域密钥 一般在表单(form)中使用
for 标签模板
for标签模板
forloop.counter 从1开始计算获取当前索引
forloop.counter0 从0开始计算获取当前索引
forloop.revcounter 索引从最大数递减到1
forloop.revcounter0 索引从最大数递减到0
forloop.first 当前元素是否是第一个
forloop.last 当前元素是否为最后一个
empty 为空的情况
4.1 模板标签举例
views.py 传一个列表
# 通过类创建视图
class Template(View):
def get(self,request,name):
list_data = range(10)
return render(request,'index.html',{'name':name,'list_data':list_data})
index.html 用模板标签写循环和判断
<!--for 循环-->
<ul>
{% for item in list_data %}
<li>{{ item }}--{{forloop.counter}}--{{forloop.counter0}}--{{forloop.revcounter}}</li>
<!-- if 判断-->
{% if forloop.first %}
this is firsr number
{% elif forloop.last %}
this is last number
{% endif %}
{% endfor %}
</ul>
结果如下:
图片的加载:根目录下新建 static 文件夹,再新建 image 文件夹,放入一张图片;
settings 新增配置:
# 配置静态文件
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'statics')
]
index.html 中加载这张图片
{% load staticfiles %}
<img src="{% static 'images/测试下载1.jpg' %}" />
效果如下:
4.3模板过滤
内置过滤器与自定义过滤器
过滤器的用处
用于在htm模板中,对于渲染过来的数据进行二次操作使用,过滤器其实就是用来处理这些数据的模板引擎中使用的函数
常用过滤器介绍
内置过滤器使用方法说明
add 给value的值加10 {{value|add:10}}
date 把日期格式按照规定的格式化显示 {{value|date:"Y-m-d H:i:s"}}
cut 将value中的xx删掉 {{value|cut:'xx'}}
capfirst value首字母大写 {{value|capfirst}}
default 值为false时使用默认值 {{value|default:'xx'}}
default_if_none 值为空时使用默认值 {{value|default_if_none:'xx'}}
dictsort 值为字典的列表,按照key排序 {{value|dictsort:'key'}}
dictsortreversed 按照key值反序 {{value|dictsortreversed:'key'}}
first 返回列表中的第一个索引值 {{value|first}}
floatformat 保留小数点后两位 {{value|floatformat:2}}
join 类似python中的xx.join(value) {{valueljoin:'xx'}}
last 返回列表中的最后一个索引值 {{value|last}}
length 返回值的长度 {{value|length}}
divisbleby 如果值可以被2整除即返回true {{value|divisibleby:2}}
length_is 如果值长度为2即返回true {{value|length_is:'2'}}
safe 将字符串中的html标签在前端安全展示 {{value|safe}}
random 随机返回列表中的一个值 {{value|random}}
slice 截取前两个字符 {{value|silce:'2'}}
slugify 值小写,单词用-分隔 {{value|slugify}}
upper 字符串大写 {{valuelupper}}
urlize 字符串中的链接可点击 {{valuelurlize}}
wordcount 字符串中的单词数 {{value|wordcount}}
timeuntil 距离当前日期的天数和小时数(未来时间) {{value|timeunti1}}
模板使用方法例子:
创建一个子应用 templatefunc,
创建子应用的路由,在根路由中引用
views.py
from django.shortcuts import render
# Create your views here.
from django.shortcuts import render
from django.views.generic import View
import datetime
class templatefunc(View):
def get(self,request):
dict_data = {}
dict_data['count'] = 10
dict_data['time'] = datetime.datetime.now()
dict_data['cutt'] = '删除两个字'
dict_data['Aa'] = 'apple'
dict_data['result'] = False
dict_data['res'] = None
dict_data['dict_list'] = [{'name':'jack','age':25},{'name':'bob','age':21}]
dict_data['floatnum'] = 3.141592654
dict_data['html_str'] = '<span style="display:block;background-color:red;width:40px;height:14px;"></span>'
dict_data['listnum'] = range(5)
dict_data['words'] = "百度一下 https://WWW.Baidu.com 你就知道。Baidu it and you will know."
dict_data['fulture'] = dict_data['time'] + datetime.timedelta(days=5)
return render(request,'templatefunc.html',dict_data)
templatefunc.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>templatefunc</title>
</head>
<body>
<h1>这是templatefunc</h1>
<p>初始的count:{{count}}</p>
<p>count + 10:<span> </span>{{count|add:10}} </p>
时间:<span> </span>{{time}}--- {{time|date:'Y-m-d H-i-s'}}
<br>
cut: <span> </span>{{cutt}}--- {{cutt|cut:'两个'}}
<br>
capfirst首字母大写:<span> </span>{{Aa}}---{{Aa|capfirst}}
<br>
值为false 时使用默认值:<span> </span>{{result}}---{{result|default:'默认值'}}
<br>
值为空时使用默认值:<span> </span>{{res}}---{{res|default_if_none:'默认值'}}
<br>
值为字典时按照key排序:<span> </span> {{dict_list}}---{{dict_list|dictsort:'age'}}
<br>
按照 key 值反序:<span> </span> {{dict_list}}---{{dict_list|dictsortreversed:'age'}}
<br>
返回列表中的第一个索引值:<span> </span> {{dict_list}}---{{dict_list|first}}
<br>
保留小数点后两位:<span> </span>{{floatnum}}---{{floatnum|floatformat:2}}
<br>
类似python中的xx.join(value):<span> </span> {{Aa}}---{{Aa|join:'-'}}
<br>
返回列表中的最后一个索引值:<span> </span> {{dict_list}}---{{dict_list|last}}
<br>
返回值的长度:<span> </span>{{cutt}}---{{cutt|length}}
<br>
如果值可以被2整除返回 true:<span> </span> {{floatnum}}---{{floatnum|divisibleby:2}}
<br>
如果值长度为2返回 true :<span> </span>{{cutt}}---{{cutt|length_is:'2'}}
<br>
将字符串中的 html 标签在前端安全展示 :<span> </span>{{html_str}}---{{html_str|safe}}
<br>
随机返回列表中的一个值 :<span> </span>{{listnum}}---{{listnum|random}}
<br>
提取前两个字符串 :<span> </span>{{cutt}}---{{cutt|slice:'2'}}
<br>
值小写,单词用-分隔 :<span> </span>{{words}}---{{words|slugify}}
<br>
字符串大写 :<span> </span>{{words}}---{{words|upper}}
<br>
字符串中间的链接可点击:<span> </span> {{words}}---{{words|urlize}}
<br>
字符串中的单词数 :<span> </span>{{words}}---{{words|wordcount}}
<br>
距离当前日期的天数和小时数(未来时间):<span> </span> {{fulture}}---{{fulture|timeuntil}}
<br>
{% load myfilter %}
自定义过滤器 {{count}}---{{count|test_filter:10}}
</body>
</html>
效果:
4.4、创建自定义过滤器
在子应用下创建New Python package包, templatetag,再创建 myfilter.py文件
myfilter.py 编写自己的过滤器
from django import template
register = template.Library()
@register.filter # 加一个装饰器
def test_filter(value,args):
return value * args
在 html 中引用,(引用之后需要重启服务器,才能找到这个包)
<br>
{% load myfilter %}
自定义过滤器 {{count}}---{{count|test_filter:10}}
</body>
显示效果
Jinja2模板
Jinja2的一些常用过滤器
渲染时不转义 safe
把值的首字母转换成大写,其他字母转换成小写 capitalize
把值转换成小写形式 lower
把值转换成大写形式upper
把值中每个单词的首字母都转换成大写 title
把值的首尾空格去掉 trim
渲染前把值中所有的HTML标签都删掉 striptags