一、Django简介
Django是一个出色的web框架,它是一个“大而全”的框架。
1、MVC设计模式(开发模式)
Model层:操作数据库的层,存取数据。
View层:视图层,用来向用户显示的。
Controller层:控制层,接收用户请求,处理业务逻辑,可以调用模型层存取数据,获取从模型层中查询的数据,选择相关的View层进行显示。
2、MTV设计模式(开发模式)
Model层:模型层,操作数据库的层,存取数据。
Template层:模板层,负责向客户端显示的。
View层:视图层,接收用户请求,处理业务逻辑,可以调用模型层存取数据,获取从模型层中查询的数据,选择相关模板进行显示,还可以重定向、返回响应文本。
注意:在Django中的View是以视图函数来实现的。 MVC与MTV在本质上是一样的,都是为了分工明确、“低耦合”。
二:路由配置
在settings.py中ROOT_URLCONF变量规定了Django项目的主路由文件(urls.py), 通过主路由文件中的配置可以找到子路由配置文件(应用路由urls.py)。 在主路由配置文件中通过include()函数加载子路由配置文件。
#主路由配置(Django/urls.py) from django.contrib import admin from django.urls import path,include #加载子路由 urlpatterns = [ path('admin/', admin.site.urls), #子路由应用中url path('myapp/',include('myapp.urls')), path('myapp2/',include('myapp2.urls')) ]
#子路由配置(Django/myapp/url.py) from django.urls import path from myapp2.views import * urlpatterns = [ path('gologin/', go_login), path('login/',login),
三:URL动态传参
1、动态捕获参数
通过在路由文件中的path()函数中的第一个url参数捕获客户端传递的参数,通过 在匹配URL中添加"<参数名>"动态捕获参数。 eg: path('book/<author>/<book_name>/',show_book)
2、动态传递参数
视图函数中的形式参数名与URL动态捕获的参数名一致。def show_book(request,author,book_name): pass
3、对捕获的参数进行类型转换
通过转换器进行数据类型转换 eg: path('add/int:a/int:b/',add),
四:re_path()正则匹配路径
re_path()函数的第一个参数是通过用正则表达式匹配路径的方式来寻找视图函数。
re_path()函数也可以进行参数的动态捕获:使用小括号进行捕获参数:re_path(r'time/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/',show_date)
五:视图函数加载模板
1.视图函数通过返回render(request,'模板路径')函数加载模板 2.视图函数也可以通过render()函数向模板传递字典,模板接收到数据后可以通过
{{ 模板变量名 }}显示数据,模板变量名必须与字典中的key一致。
eg: render(request,'login.html',{'msg':"用户名或密码错误,请重新登录!"})
六、补充:
1.启动开发服务器:
python manage.py runserver # 启动本地的端口号为8000的服务器
python manage.py runserver 8888 # 启动本地的端口号为8888的服务器
python manage.py runserver 0.0.0.0:8888 # 任何主机都可以访问端口号为8888的服务器 注意:如果想要任何主机都能访问,则settings.py中要配置 ALLOWED_HOSTS = ['*',]
2、创建应用
在Terminal中输入:python manage.py startapp 应用名称
创建应用后在Django/settings.py中的INSTALLED_APPS = [ 添加应用]
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp.apps.MyappConfig', 'myapp2', #添加myapp2应用 ]
七、附录
1、Django/urls.py #主路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/',include('myapp.urls')),
path('myapp2/',include('myapp2.urls'))
]
2、Django/myapp/urls.py #子路由
from django.urls import path, re_path
from myapp.views import *
urlpatterns = [
path('hello/',hello),
path('book/<author>/<book_name>/',show_book),#捕获参数
path('add/<int:a>/<int:b>/',add), #int:对捕获的参数转换
re_path(r'welcome/',welcome),
re_path(r'time/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/',show_date)
]
3、Django/myapp2/urls.py #子路由
from django.urls import path
from myapp2.views import *
urlpatterns = [
path('gologin/', go_login),
path('login/',login),
]
4、Django/myapp/view.py #视图函数
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def hello(request):
return HttpResponse("<h3 style='color:red'>hello,欢迎学习</h3>")
def show_book(request,author,book_name):
info = "<h3><span style='color:blue'>" + author +"</span>写了一本名为<span style='color:red'>" +book_name +"</span>的书</h3>"
return HttpResponse(info)
def add(resquest,a,b):
result = a + b
return HttpResponse("相加结果是:"+str(result))
def welcome(request):
return HttpResponse("<h3>北京欢迎你</h3>")
def show_date(request,year,month,day):
return HttpResponse("<h3>接收的年份是:"+year+";月份是:"+month+",日期是:"+day+"</h3>")
5、Django/myapp2/view.py #视图函数
from django.shortcuts import render
def go_login(request):
return render(request,'login.html')#加载模板
def login(request):
loginname = request.POST["loginname"]#接收参数
loginpwd = request.POST["loginpwd"]
if loginname == "tom" and loginpwd == "123456":
return render(request,'success.html',{'username':loginname}) #加载模板
else:
return render(request,'login.html',{'msg':"用户名错误,请从新登录"})
6、Django/myapp2/templates/longin.html #视图模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<h3 style="color: red">{{msg}}</h3>
<form action="/mypp2/login/" method="post">
登录名:<input type="text" name="loginname"/><br/>
登陆密码:<input type="password" name="loginpwd"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
7、Django/myapp2/templates/success.html #视图模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>成功登录</title>
</head>
<body>
恭喜{{username}},登陆成功!
</body>
</html>