Django
命令行命令
#启动项目
python manage.py runserver
#创建一个APP,还要在setting.py里的INSTALLED_APPS添加myapp
python manage.py startapp myapp
如果要让远程客户端连接需要修改配置⽂件
#修改setting.py中的这⼀⾏
ALLOWED_HOSTS = ['*']
视图
在django中view代表视图函数,接收⽤户的请求,进⾏处理然后返回html源代码 给客户端。在框架中,我们可以在应⽤(app)的views.py中写⾃⼰的视图函数, 进⾏相应的处理。 视图函数只是⼀个普通的python函数,它的第⼀个参数必须是⼀个请求 (request)对象,这是框架传⼊的,我们可以通过请求对象获取提交参数等内 容。它的返回值必须是⼀个web响应对象,可以⽂本、html源代码、᯿定向、404 等内容。下⾯我们写⼀个简单视图函数,返回“Hello Django"
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello Django")
路由
在自己创建的app中添加url.py,这是子路由,和程序中原本的url.py是一样的,可以直接复制
添加了子路由,就必须在主路由中include进去
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
#根路由
path('admin/', admin.site.urls),
#把子路由include进来
#user/ 路由前缀
path('user/',include('myapp.urls')),
]
HttpRequest
HttpResquest 是从web服务器传递过来的请求对象,经过Django框架封装产⽣的, 封装了原始的Http请求 服务器接收到http请求后,django框架会⾃动根据服务器传递的环境变量创建 HttpRequest对象 视图的第⼀个参数必须是HttpRequest类型的对象 在django.http模块中定义了HttpRequest对象的API 使⽤HttpRequest对象的不同属性值,可以获取请求中多种信息.。
#requset常用属性
# #get传参的获取,在浏览器尾部添加值 http://127.0.0.1:8000/user/tel/12345678/?username=tom&age=20&age=23
# print((request.GET))#GET qusersetDICT字典
# #获取单一值
# print(request.GET.get('username'))
# #获取全部值
# print(request.GET.getlist('age'))#返回值是一个列表
HttpResponse
# #POST
# #单值,利用渲染
# print(request.POST.get('username'))
# #多值
# print(request.POST.getlist('hobby'))
其他方法
# #获取请求方法
# print(request.method)
#
# #获取请求路径
# print(request.path)
#
# #其他属性
# print(request.META)
# #客户端地址
# print(request.META.get('REMOTE_ADDR'))
# #来源页面
# print(request.META.get('HTTP_REFERER'))
# #常用方法
# print(request.get_full_path())#/user/tel/12345678/?name=2222
# print(request.get_host())#127.0.0.1:8000
# print(request.build_absolute_uri())#http://127.0.0.1:8000/user/tel/12345678/?name=2222 完整的请求路径
#获取请求参数的字典
print(request.GET.dict())#{'name': '2222'}
调⽤模板返回
首先要在templates当中创建一个html文件
重定向
#HttpResponseRedirect 重定向到指定路由,参数就是路由
#return HttpResponseRedirect('/user/')
#redirect 是 HttpResponseRedirect快捷方式
return redirect('/user/')
反向定位
#反向定位:由应用命名空间:name来确定路由,在url里面写
app_name='APP' #应用的名空间
#return redirect(reverse('APP:index')) #不带参数
#如果参数有名字,必须用kwargs传参方式
#return redirect(reverse('APP:show',kwargs={'name':'tom','age':12}))
return redirect(reverse('APP:call',args=('0123-12345678',)))
动态路由
前⾯写的url都是静态的,无法给视图函数传递数据,要想给视图函数传参数,url 必须是动态,带有参数,但Django主张漂亮简介的url,所以不会使⽤查询字符串 (/hello?name=tom),⽽是采⽤通配符:
#路由列表 名称就叫urlpatterns
urlpatterns= [
#不能斜线开头
#首页
#path的第三个参数name是路由的名称,和视图函数参数无关
path('home/',views.home,name='home'),
#视图函数中的参数必须和路由中参数名称相同
#int 带参数
path('show/<int:age>/',views.show,name='show'),
#slug
path('list/<slug:name>',views.list_user,name='list'),
#path,如果有多个参数,path类型必须在最后
path('access/<path:path>/',views.access,name='access'),
#String 默认参数类型
path('change/<name>/',views.change_name,name='change'),
#re_path 和 path最大的区别就是匹配时正则模式串,能少用就少用
re_path(r'^tel/(\d{8})/$',views.get_phone,name='phone'),
]
模板
模板位置
第一种在应⽤中建⽴templates⽬录,好处不需要注册,不好的地⽅,有多个应⽤的 时候不能复⽤⻚⾯
第⼆种是放在⼯程的⽬录下,好处是如果有多个应⽤,可以调⽤相同的⻚⾯, 需要注册 。
模板语法
变量
视图中定义方法
def handle_var(request):
num=10
name='中国'
students=[10,20,30,40,[50,60]]
student={'name':'缪程','age':30}
return render(request,'变量.html',locals())
<body>
{# 变量 #}
{# 复杂类型的访问可以连续使用.,不能使用下表 #}
{{ num }}
<p>
{# 不能写表达式 #}
{{ name }}
</p>
<hr>
<p>
{# 不能使用下标 #}
{{ students.0 }}
{{ students.4.0 }}
</p>
<p>
{{ student.name }}
</p>
</body>
过滤器
过滤器是在变量显示之前修改它的值的⼀个⽅法,过滤器使⽤管道符.
{{变量|方法}}
def handle_filter(request):
num=10
name='缪程'
#age= None
t1 = datetime.now()
return render(request,'过滤器.html',locals())
<body>
{# 过滤器 #}
{{ num|add:'10' }}
<p>
{{ age|default_if_none:'您好' }}
{# 如果变量不存在 #}
{{ age|default:'ok' }}
</p>
<p>
{{ t1|date:'Y-m-d H' }}
</p>
<p>
{# 自定义过滤器 #}
{{ 5|sub1 }}
</p>
自定义过滤器,在APP里面创建一个包,必须是templatetags,在包里面创建py文件。
from django import template
#建立模板对象
register = template.Library()
#装饰器,指定装饰器的名字
@register.filter(name='sub1')
def sub(value): #参数最多俩个
return value - 1
内置标签
def handle_tag(request):
l1=[20,30,40]
num=18
return render(request,'tag.html',locals())
<body>
{# 不可以使用小括号 #}
{# 构造复杂条件,需if 嵌套 #}
{% if num < 10 %}
<p>武汉加油</p>
{% elif num < 20 %}
<p>中国加油</p>
{% elif num < 20 %}
<p>世界加油</p>
{% endif %}
<p>
{% for value in l1 %}
<li>{{ value }}</li>
{% endfor %}
</p>
<p>
{% for value in l1 reversed %}
<li>{{ forloop.counter0 }}--{{ value }}</li>
{% endfor %}
</p>
</body>
#用于判断俩个值是否相等
{% ifequal var var %}
{% endifequal %}
{% ifnotequal var var %}
{% endifnotequal %}
模板导入标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% include 'app01/div.html' %}
</body>
</html>
#导入的文件只能写这么多
<div>
被包含的文件
</div>
在模板中url标签可⽤于反向解析
<body>
<ul>
<li><a href="{% url 'APP01:index' %}">首页</a></li>
<li><a href="{% url 'APP01:show' name='admin' %}">show</a></li>#带参
</ul>
</body>