ALLOWED_HOSTS
允许以那个主机形式访问后端
默认127.0.0.1
如果修改了允许的方式,需要将运行的 ip 域名 添加进去
默认的127 需要自己添加进去 才可以访问
安全机制 只能以罗列的 来访问
ALLOWED_HOSTS = ["192.168.230.128","127.0.0.1"]
Url conf
匹配路由的时候我们严格要加/
正确:path/
正确:path
reverse
就是通过name动态获取路径(或者路由)
如果没有设置namespace 则可以通过namespace:name来获取 reverse(namespace:name)
name
我们可以通过name能找到路由
name就是给url起一个名字
# 登陆成功之后需要跳转到首页
# 注册之后跳转首页
# viewname 通过视图名字
# 路由动态获取
path = reverse('index')
print(path)
HttpRequest对象
-
提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
-
查询字符串(query string),形如key1=value1&key2=value2;
-
请求体(body)中发送的数据,比如表单数据、json、xml;
-
在http报文的头(header)中。
第一种通过url来获取数据
-
如果想从URL中获取值,需要在正则表达式中使用分组,
-
获取值分为两种方式
- 位置参数
- 参数的位置不能错
- 关键字参数
- 参数的位置可以变,跟关键字保持一致即可
- 位置参数
-
注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式
-
分别使用以上两种获取URL值的方式提取出
18 188
URL 配置
# 根据url来获取数据
# http://127.0.0.1:8000/category_id/book_id/
# 分组获取正则数据
# 进行正则的数据会传递给视图
# 定义视图的时候,需要变量来接收
url(r'^(\d+)/(\d+)/$',detail)
# url(r'^(?P<category_id>\d+)/(?P<book_id>\d+)/$',detail)
view配置
def detail(request,category_id,book_id):
# 1/100/
print(category_id,book_id)
return HttpResponse("detail")
####################查询字符串##############################
"""
https://www.baidu.com/s?tn=02003390_43_hao_pg&isource=infinity&iname=baidu&itype=web&ie=utf-8&wd=itcast
以?为分割
?前表示 路由
?后表示 get方式查询 称之为 查询字符串
我们在登录的时候输入账号和密码,用户名和密码应该以post传递,只是为了让大家好理解,我们接下来用get传递用户名和密码
"""
# params = request.GET
# print(params)
# user_name = params["username"]
# pwd = params["password"]
# QueryDict: {'password': ['123'], 'username': ['itcast']}
# QueryDict 普通的字典形式获取一键一值的时候,只能获取到最后一个值
# 我们想获取一键多值的话 我们需要使用QueryDict的list方法
# users = params.getlist('username')
# print(users)
#####################POST表单##################################
# data = request.POST
# print(data)
#####################POST JSON##################################
# json 是双引号
"""
{
"name":"itcast"
}
"""
# print(request.POST)
# body = request.body
# b'{\n "name":"itcast",\n "password":"123"\n \n}'
# body_str = body.decode() # JSON形式的字符串
"""
{
"name":"itcast",
"password":"123"
}
"""
# json
# json.dumps 将字典转换为JSON形式的字符串
# json.loads 将json转换为字典
# print(body_str)
# print(type(body_str))
# print('11111111111')
# data = json.loads(body_str)
# print(data)
#####################请求头##################################
# print(request.META["CONTENT_TYPE"])
# print(request.method)
# return HttpResponse("detail")
#####################重定向##################################
# 需求跳转到首页
# 通过reverse 这个名字找到路径
path = reverse('book:index')
return redirect(path)
# return redirect('/home/')
# return redirect('http://www.itcast.com')
#####################JsonResponse##################################
from django.http import JsonResponse
data = {"name": "itcast"}
return JsonResponse(data)
#####################HttpResponse##################################
# data = {"name":"itcast"}
# return HttpResponse(data)
# 传递字符串 二进制数据 要传递 对象字典等数据
# status状态码 HTTP status code must be an integer from 100 to 599.只能使用系统的
# content_type 是一个MIME类型
# 语法形式是:大类/小类
# application/json
# img/png img/jpg img/gif
# return HttpResponse("detail", status=404)
状态保持
面试题:
你是如何理解cookie?/你谈一谈cookie?
1.概念
2.流程(大体流程,从http角度)
3.在开发过程中哪里使用
4.你在开发中遇到什么最深刻的地方
保存在客户端的数据叫做cookie
cookie保存在客户端
cookie是基于域名的
1.流程
第一次请求过程
1.因为是第一次请求,所以就没有cookie信息
2.服务器接收到请求后,没有cookie信息设置cookie信息
3.cookie信息设置在响应中
4.浏览器接收到这个响应后会发现响应中,有cookie信息 name=itcast,浏览器会将cookie信息保存到浏览器
第二次集齐之后过程
5.浏览器第二次及集齐后的请求都会携带cookie信息
6.服务器就会接收到请求携带的cookie信息 name=itcast,这样就认识是谁的请求了
2.看到效果
3.通过从http协议角度深度掌握cookie的流程(原理)
第一次请求
1.我们第一次去请求服务器的时候,没有携带如任何cookie信息,cookie信息实在请求头中携带
2.我们的服务器在响应中设置cookie,我们在响应头中发现set_cookie 这个信息
第二次集齐之后
3.第二次集齐之后的请求都会携带cookie信息 cookie信息实在请求头中
4.结合代码 当我们没有再设置cookie信息,我们就会发现没有任何set_cookie信息了
session
问题1:换了浏览器还能获取到session信息? 答案:不可以
问题2:我不换浏览器,删除sessionid 则获取不到session信息
问题3:再去执行set,会重新设置sessionid
session需要依赖于cookie
如果浏览器禁用了cookie,session就不能实现了
0.概念
1.流程
第一次请求
1.第一次请求的时候可以携带一些信息(用户名密码) cookie中没有任何信息
2.当我们服务器接收到这个请求后,进行用户名和密码检查,检查没有问题可以设置session信息
3.在设置session信息的同时(session会保存在服务器端),服务器会在响应头中设置一个sessionid的cookie信息
4.浏览器(浏览器)在接收到这个响应之后,会将cookie的信息包存起来(保存sessionid的信息)
第二次集齐请求
5.第二次集齐之后的请求都会携带session_id信息
6.当服务器接收到请求之后,会获取到sessionid信息然后进行验证,验证成功,则可以获取session信息
2.效果
3.从原理(http)
第一次请求
1.第一次请求是没有cookie信息的
2.我在设置session的时候,设置seesion的时候其实session做了两件事,第一件将数据保存在数据库中,第二件生成设置cookie信息,是以seesionid 为 key cookie肯定会以响应的形式在响应头中
第二次集齐之后
3.第二次集齐之后的请求都会携带cookie信息 cookie信息中有sessionid,cookie在请求头中
类视图
登录页面
GET 请求获取登陆界面
POST 请求验证登陆(用户名和密码)
def show_login(request):
return render(request)
def veri_login(request):
return redirect('首页')
两个视图合并成一个
def login(request):
我们需要区分逻辑
if request.method == 'GET':
GET 请求获取登录页面
pass
else:
请求验证登陆(用户名和密码)
pass
面向对象
类视图 是采用的面向对象的思路
1.定义类视图
1.继承自View
2.不同的请求方式,有不同的业务逻辑
类视图的方法 就直接采用http的请方式的名字,作为我们函数名,例如:get post put
3.我们类视图方法的第二个必须是请求实例对象,类视图必须有返回,返回值是HttpResponse及其子类
2.类视图的url引导
class LoginView(View):
def get(self, request):
return HttpResponse("get")
def post(self, request):
return HttpResponse("post")
def put(self, request):
return HttpResponse('put')
def oooo(self, request):
return HttpResponse('ooooo')
中间件
1 中间件的定义方法
定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
场景:
中间件的作用:每次请求和响应的时候都会调用
中间件的定义
中间件的使用:我们可以每次判断请求中是否携带了cookie中某些信息
在book里新建一个middleware.py文件
def simple_midleware(get_response):
# 这里是中间件第一次只想的地方
# print('1111111111111')
def middleware(request):
# username = request.COOKIES.get('username')
# if username is None:
# print('username is None')
# return HttpResponse("未登陆")
# 请求前
print("before request 1111111111111111")
response = get_response(request)
# 响应后
print("after response 1111111111111111")
return response
return middleware
def simple_midleware2(get_response):
# print("222222222222222")
def middleware(request):
# username = request.COOKIES.get('username')
# if username is None:
# print('username is None')
# return HttpResponse("未登陆")
# 请求前
print("before request 222222222222222")
response = get_response(request)
# 响应后
print("after response 2222222222222222222")
return response
return middleware
setting注册:
# 请求前的执行顺序是按照注册的顺序执行的
# 请求后或者响应后的执行循序,是倒序
'book.middleware.simple_midleware',
'book.middleware.simple_midleware2'
主要判断每次判断请求中是否携带了cookie中某些信息,一般也不常用