python编程快速上手(持续更新中…)
HttpRequest对象
1、url路径参数
http:127.0.0.1:8000/10/188
视图中函数,参数位置不能变
def shop(request,city_id,shop_id):
# print(cat_id, goods_id)
return JsonResponse({‘city_id’:city_id, ‘shop_id’:shop_id})
应用中的urls
path(’<city_id>/<shop_id>/’,shop),
http://127.0.0.1:8000/1/2/?order=readcount&page=1&order=commentcount
def shop(request,city_id,shop_id):
query_params = request.GET
print(query_params)
print(query_params.get(‘order’))
print(query_params.getlist(‘order’))
return JsonResponse({‘city_id’:city_id, ‘shop_id’:shop_id})
2、post请求
403
默认禁止访问,禁用middleware
3、发送post数据
def json(request):
body = request.body
print(body)
body_str = body.decode()
print(body_str)
return HttpResponse('ok')
4、请求头
header = request.META
print(header)
5、路径参数校验
path(‘int:city_id/<shop_id>/’,shop),
6、自定义转换器
# 1. 定义转换器
class MobileConverter:
# 验证数据的关键是: 正则
regex = '1[3-9]\d{9}'
# 验证没有问题的数据,给视图函数
def to_python(self, value):
return value
register_converter(MobileConverter,'phone')
path('<int:city_id>/<phone:shop_id>/',shop),
HttpResponse对象
1、响应结果
def response(request):
response = HttpResponse('res', status=200)
response['name']='张三'
# 1XX
# 2XX
# 200 成功
# 3XX
# 4XX 请求错误
# 403 禁止访问,权限问题
# 404 找不到页面,路由问题
#
# 5XX 响应错误
return response;
2、JsonResponse
dict = {‘name’:‘zhangsan’, ‘age’:18}
response = JsonResponse(dict)
集合
girls = [
{
'name':'xiaoli',
'age':18
},
{
'name':'cunhua',
'age':'17'
}
]
response = JsonResponse(data=girls, safe=False)
3、redirect重定向
return redirect(‘www.baidu.com’)
状态保持
Cookie
http://127.0.0.1:8000/set_cookie/?username=ls&password=123
def set_cookie(request):
# 1. 获取查询字符串数据
username = request.GET.get('username')
password = request.GET.get('password')
print(username, password)
# 2. 服务器设置cookie信息
# 通过响应对象.set_cookie 方法
response = HttpResponse('set_cookie')
# key, value=''
# max_age 是一个秒数 从响应开始 计数的一个秒数
response.set_cookie('name', username, max_age=60*60)
response.set_cookie('password', password)
return response
http://127.0.0.1:8000/get_cookie
def get_cookie(request):
# 获取cookie
print(request.COOKIES)
# request.COOKIES 字典数据
name = request.COOKIES.get('name')
return HttpResponse(name)
session
session 操作
新增
request.session[‘key1’]=val1
读取
request.session.get(‘key1’)
清除所有session值
request.session.clear()
清除所有session值,包括key
request.session.flush()
删除指定key中的值
del.requset.session[‘key1’]
设置session有效期 0:浏览器关闭后失效,
request.session.set_expiry(val1)
应用:
http://127.0.0.1:8000/set_session/?username=zs
def set_session(request):
# 1. 模拟 获取用户信息
username = request.GET.get('username')
# 2. 设置session信息
# 假如 我们通过模型查询 查询到了 用户的信息
user_id = 1
request.session['user_id'] = user_id
request.session['username'] = username
# clear 删除session里的数据,但是 key有保留
# request.session.clear()
# flush 是删除所有的数据,包括key
# request.session.flush()
request.session.set_expiry(3600)
return HttpResponse('set_session')
http://127.0.0.1:8000/get_session/
def get_session(request):
# user_id=request.session['user_id']
# username=request.session['username']
# 获取字典的时候,尽量用get,减少异常发生
user_id=request.session.get('user_id')
username=request.session.get('username')
# '%s'%username
content = '{} ,{}'.format(user_id,username)
return HttpResponse(content)
session保存redis中
1、安装django-redis
pip install django-redis
2、配置
在settings.py文件中做如下设置
#################session 保存在redis中######################
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
3、设置session
http://127.0.0.1:8000/set_session/?username=zs
4、查询
http://127.0.0.1:8000/get_session/
类视图定义
使用类定义视图,成为类视图
1、类视图定义
"""
类视图的定义
class 类视图名字(View):
def get(self,request):
return HttpResponse('xxx')
def http_method_lower(self,request):
return HttpResponse('xxx')
1. 继承自View
2. 类视图中的方法 是采用 http方法小写来区分不同的请求方式
"""
from django.views import View
class LoginView(View):
def get(self,request):
return HttpResponse('get get get')
def post(self,request):
return HttpResponse('post post post')
2、使用:http://127.0.0.1:8000/163login/
urls
from book.views import LoginView
#########################类视图
path('163login/', LoginView.as_view())
3、405请求方式不准许
posman put 请求
4、as-view()为什么加’()’
类试图与中间件
as_view()源码介绍
dispatch
登录验证
1、创建登录用户
python manager.py createsuperuser
2、OrderView
"""
我的订单、个人中心页面
如果登录用户 可以访问
如果未登录用户 不应该访问,应该跳转到登录页面
定义一个订单、个人中心 类视图
如果定义我有没有登录呢??? 我们以登录 后台站点为例
"""
from django.contrib.auth.mixins import LoginRequiredMixin
# LoginRequiredMixin 作用 判断 只有登录用户才可以访问页面
# class OrderView(View,LoginRequiredMixin):
class OrderView(LoginRequiredMixin,View):
def get(self,request):
#模拟了一个标记位
# isLogin=False
# if not isLogin:
# return HttpResponse('你没有登录,跳转到整理页面中~~~~')
return HttpResponse('GET 我的订单页面,这个页面必须登录')
def post(self,request):
return HttpResponse('POST 我的订单页面,这个页面必须登录')
中间件
请求与响应中间事件
常用方式
Init
Process-request
Process_response
1、定义中间件
from django.utils.deprecation import MiddlewareMixin
class TestMiddleWare(MiddlewareMixin):
def process_request(self,request):
print("111111111111111每次请求前 都会调用执行")
# username=request.COOKIES.get('name')
# if username is None:
# print("没有用户信息")
# else:
# print("有用户信息")
def process_response(self,request,response):
print("每次响应前 都会调用执行111111111111111111111111")
return response
2、注册中间件
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',
#注册中间件
'book.middleware.TestMiddleWare',
]
3、顺序
请求由上往下,响应由下往上