> python manage.py makemigrations
> python manage.py migrate
> python manage.py runserver
视图就是一个Python中的函数
ROOT_URLCONF = 'test1.urls'
语句中配置urlpatterns
:这是一个url的实例列表,url对象
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# url(r'^', include('sunck.urls')), # ^表示什么都不输入,就是主页,加r表示不转义
# 然后就跳转到sunck.urls.py这个文件中,再在sunck.urls.py文件中配置视图
path('', include('sunck.urls', namespace='sunck'))
]
from django.conf.urls import url
from django.urls import path
from . import views # 引入当前目录下的views
app_name = "sunck"
# 命名app名称,给projests/urls.py中的path('', include('sunck.urls', namespace='sunck'))
# 中的namespace设置可以搜索到的名字
urlpatterns = [
url(r'^$', views.index),
path('//' , views.detail, name='detail'),
# def detail(request, num, num2):
# return HttpResponse("detail-%d-%d" % (num, num2))
path('students/', views.students, name='students'),
path('grades/' , views.grades_students, name='gradesStudents'),
]
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404NOT Foundtitle>
head>
<body>
<h1>您请求的页面跑丢了h1>
<h2>您请求的页面是:{{ request_path }}h2>
body>
html>
DEBUG = False
ALLOWED_HOSTS = ['*']
DEBUG = False
配置后,Django的admin界面的CSS和js文件等都会出现找不到的情况,如果出现类似情况只需要把这个改回来就可以了,但是404页面也就变成了原来的Django样式。path: 请求的完整路径(不包括域名和端口)
method: 表示请求的方式,常用的有GET,POST
encoding: 表示浏览器提交的数据的编码方式,一般为utf-8
GET: 类似于字典的对象,包含了get请求的所有参数
POST: 类似于字典的对象,包含了post请求的所有参数
FILES: 类似字典的对象,包含了所有上传的文件
COOKIES: 字典,包含所有的cookie
session: 类似字典的对象,表示当前会话
# urls.py
path('request/', views.requests, name='request'),
# views.py
def requests(request):
request_list = {
'request.path': request.path,
'request.method': request.method,
'request.encoding': request.encoding,
'request.GET': request.GET,
'request.POST': request.POST,
'request.FILES': request.FILES,
'request.COOKIES': request.COOKIES,
'request.session': request.session,
'request.is_ajax()': request.is_ajax(),
}
return render(request, 'sunck/request.html', {'request_list': request_list})
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTTPrequest属性和方法测试title>
head>
<body>
<h1>HTTPrequest属性和方法测试h1>
<ul>
{% for key, value in request_list.items %}
<li>{{ key }}:{{ value }}li>
{% endfor %}
ul>
body>
html>
is_ajax(): 如果是通过XMLHttpRequest发起的,返回 True
www.sunck.wang/abc?a=1&b=2&c=3
www.sunck.wang/abc?a=1&a=2&c=3
获取浏览器传递给服务器的数据
每个键只能对应一个数据
http://127.0.0.1:8000/sunck/GET/?a=1&b=2&c=3
# 获取get传递的数据
def gets(request):
get_list = {
'a': request.GET.get('a'),
'b': request.GET['b'], # 也可以用这种方式
'c': request.GET.get('c'),
}
return render(request, 'sunck/GET.html', {'get_list': get_list})
HTML文件:“sunck/GET.html”
{#sunck/request.html#}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>GET属性和方法测试title>
head>
<body>
<h1>GET属性和方法测试h1>
<ul>
{% for key, value in get_list.items %}
<li>{{ key }}:{{ value }}li>
{% endfor %}
ul>
body>
html>
每个键可以对应多个数据,对应一个数据列表
http://127.0.0.1:8000/sunck/GET/?a=1&a=2&c=3
ef gets(request):
get_list = {
'list': request.GET.getlist('a'),
'c': request.GET.get('c'),
}
return render(request, 'sunck/GET.html', {'get_list': get_list})
对应的HTML文件和上边的一样
利用表单模拟POST请求。
下面简单介绍使用一个注册的页面,传递数据给另外一个界面。
这个页面是用户看到的注册页面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册title>
head>
<body>
<form action="../register/" method="post">
姓名:<input type="text" name="name" value=""/>
<hr>
性别:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女
<hr>
年龄:<input type="text" name="age" value=""/>
<hr>
爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money">金钱<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla
<hr>
<input type="submit" value="注册">
form>
body>
html>
这个页面是为了将用户注册的数据显示出来,其原理和register、get测试时的原理相同。
{#sunck/request.html#}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>POST属性和方法测试title>
head>
<body>
<h1>POST属性和方法测试h1>
<ul>
{% for key, value in register_list.items %}
<li>{{ key }}:{{ value }}li>
{% endfor %}
ul>
body>
html>
# POST测试
def show_register(request):
return render(request, 'sunck/POST/show_register.html', )
def register(request):
register_list = {
'name': request.POST.get('name'), # 这里的get和getlist可能没有代码提示
'gender': request.POST.get('gender'),
'age': request.POST.get('age'),
'hobby': request.POST.getlist('hobby'),
}
return render(request, 'sunck/POST/register.html', {'register_list': register_list}, )
path('POST/showRegister/', views.show_register, ),
path('POST/register/', views.register, ),
注释掉那一行
因为Django有自动预防跨站攻击
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
def index(request):
return HttpResponse('sunck is a good man')
def render(request, template_name, context=None,
content_type=None, status=None, using=None):
# request:请求体 对象
# template_name:模板路径
# context:传递给需要渲染在模板上的数据
def grades_students(request, num):
# 获得对应的班级对象
grade = Grades.graObj2.get(pk=num)
# 获得班级下的所有学生列表
students_list = Students.stuObj2.filter(sgrade_id__exact=num)
return render(request, 'sunck/students.html', {
"students": students_list,
"grade": grade.gname,
})
# response
def response(request):
response1 = HttpResponse()
response_list = {
'response.content': response1.content,
'response.charset': response1.charset,
'response.status_code': response1.status_code,
}
return render(request, 'sunck/response.html', {'response_list': response_list})
重定向,服务器端的跳转
# 重定向
from django.http import HttpResponseRedirect
def redirect1(request):
# 可以使用如下两种方式
# return HttpResponseRedirect('/sunck/redirect2/')
return HttpResponseRedirect('../redirect2/')
def redirect2(request):
return HttpResponse('我是重定向后的视图')
使用redirect(to)这个方法,在django.shortcuts中包含
# 重定向
from django.shortcuts import redirect
def redirect1(request):
# 简写
return redirect('/sunck/redirect2')
def redirect2(request):
return HttpResponse('我是重定向后的视图')
to推荐使用反向解析
__init__(self.data)
在settings.py中找到
默认情况下,Django是启用session的。
# session
from django.contrib.auth import logout
def welcome(request):
username = request.POST.get('username')
# 储存session
request.session['username'] = username
# 取session
username = request.session.get('username', '游客')
# 清除session
# logout(request)
# request.session.clear()
# request.session.flush()
return render(request, 'sunck/session/welcome.html', {'username': username})
def log(request):
return render(request, 'sunck/session/log.html', )
对应的HTML文件为
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的title>
head>
<body>
<h1>欢迎:{{ username }}h1>
<a href="/sunck/session/log/">登录a>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录title>
head>
<body>
<form action="/sunck/session/welcome/" method="post">
<input type="text" name="username"/>
<input type="submit" value="登录"/>
form>
body>
html>
request.session.set_expiry(10)
设置为10秒后过期