Django--视图层(转换器,request对象(request常用属性),HttpResponse对象,JsonResponse对象(序列化列表对象),CBV(类的视图))

自定义转换器(django2.0)

from django.urls import path, re_path, register_converter

class MyCon:
    # 写一个正则表达式
    regex = '[0-9]{4}'
    # 匹配出來的数据,会传到这里,retrun回去的,会被视图函数接收
    def to_python(self, value):
        return int(value)
    # 反向解析用的
    def to_url(self, value):
        return '%04d' % value

from django.urls import register_converter
register_converter(MyCon,'yyy')

path('test/<yyy:year>', views.re_test, name='test'),

视图层——request对象(request常用属性)

路由层:
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^test/(.*)', views.re_test),
]

视图函数:
def re_test(request,every):
    # request.POST   # 前台Post传过来的数据,包装到POST字典中
    # request.GET  # 前台浏览器窗口里携带的数据,包装到GET字典中
    # request.method   # 前台请求的方式
    # request.body  # http请求体里的所有数据,post提交的数据,body体的内容,前台会封装成:name=lqz&age=18&sex=1
    # print(request.path) # 取出请求的路径,取不到数据部分
    # print(request.get_full_path())  # 取出请求的路径,能取到数据部分   结果:/test/user?name=xx&password=123
    # print(request.META)  # http请求头里的所有数据
   myfile = request.FILES.get('myfile') # 传文件
name = myfile.name
return HttpResponse('request')




————————————————————————————————————————————————————————————————————————————————
1.HttpRequest.GET
  一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。

2.HttpRequest.POST
  一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。

  POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
   因此,不应该使用 if request.POST  来检查使用的是否是POST 方法;应该使用 if request.method == "POST"
  另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
  
   注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
        request.POST.getlist("hobby")

3.HttpRequest.body
  一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
  但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。


4.HttpRequest.path
  一个字符串,表示请求的路径组件(不含域名)。
  例如:"/music/bands/the_beatles/"

5.HttpRequest.method
  一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  例如:"GET"、"POST"


6.HttpRequest.encoding
  一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
   这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
   接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
   如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。


7.HttpRequest.META
  一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
  取值:

    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
    CONTENT_TYPE —— 请求的正文的MIME 类型。
    HTTP_ACCEPT —— 响应可接收的Content-Type。
    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
    HTTP_HOST —— 客服端发送的HTTP Host 头部。
    HTTP_REFERER —— Referring 页面。
    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
    REMOTE_ADDR —— 客户端的IP 地址。
    REMOTE_HOST —— 客户端的主机名。
    REMOTE_USER —— 服务器认证后的用户。
    REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
    SERVER_NAME —— 服务器的主机名。
    SERVER_PORT —— 服务器的端口(是一个字符串)。
  从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。


8.HttpRequest.FILES
  一个类似于字典的对象,包含所有的上传文件信息。
   FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
  注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
   包含数据。否则,FILES 将为一个空的类似于字典的对象。


9.HttpRequest.COOKIES
  一个标准的Python 字典,包含所有的cookie。键和值都为字符串。



10.HttpRequest.session
  一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
    完整的细节参见会话的文档。


11.HttpRequest.user(用户认证组件下使用)
  一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
  如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。

    例如:
    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.

       user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。

     -------------------------------------------------------------------------------------

    匿名用户 # request.user 没登陆取的是匿名用户
    class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:

    id 永远为None。
    username 永远为空字符串。
    get_username() 永远返回空字符串。
    is_staff 和 is_superuser 永远为False。
    is_active 永远为 False。
    groups 和 user_permissions 永远为空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。

视图层——HttpResponse对象,render,redirect,httpresponse

(1)render
def re_test(request,every):
    # print(request.META)
    user = {'user': 'lxx'}
    print(every)
    return render(request,'lxx.html',{'name':user})        # 重定向一个页面2)HttpResponse
from django.template import Template,Context
 def re_test(request,every):
        if request.method == 'GET':
            temp = Template('<h1>{{ user }}</h1>')
            data = Context('{"user":"lxx"}')
            ret = temp.render(data)
            return HttpResponse(ret)                       # 返回一个模板

(3) redirect

传递要重定向的一个硬编码的URL

def my_view(request):
    ...
    return redirect('/some/url/')

也可以是一个完整的URL:

def my_view(request):
    ...
    return redirect('http://www.baidu.com/') 

视图层——JsonResponse对象(序列化列表对象)

from django.http import JsonResponse
方法(1)
def re_test(request,every):
     user = {'user': 'lxx'}
     js_data = json.dumps(user)
     return HttpResponse(js_data)

方法(2)  报错,默认不支持列表形式,要想支持改源码条件
def re_test(request,every):
    lis = [1,3]
    return JsonResponse(lis,safe=False,json_dumps_params={'ensure_ascil':False})
safe=False 解决序列化列表问题
json_dumps_params={'ensure_ascil':False} 解决中文乱码问题

视图层——CBV(基于类的视图)

路由层: url(r'^test/', views.Test.as_view()),    # 先执行dispath方法,在根据不同请求分发到不同方法上,Django已启动通过倒模块就已经拿到了函数的请求地址了
视图层:
from django.views import View
class AddPublish(View):
    def dispatch(self, request, *args, **kwargs):
        print(request)
        print(args)
        print(kwargs)
        # 可以写类似装饰器的东西,在前后加代码
        obj=super().dispatch(request, *args, **kwargs)
        return obj

    def get(self,request):    # 一定要传request对象
        return render(request,'index.html')
    def post(self,request):   # 一定要传request对象
        request
        return HttpResponse('post')

补充知识点(1):
路由跳转最原始页面与报错页面
urlpatterns = [
url(r'^$', views.autherlist), 不输跳到最原始页面
...
url(r'.*', views.error) 输任意字符跳转到报错页面
]

补充知识点(2):
%04d 占四位,少了前面用0补上,多了就是多了

补充知识点(3):
APPEND_SLASH = false 等于false不会补上 /
浏览器页面书路径时,默认会 给你补上 / http://127.0.0.1:8000/autherlist/
补充知识点(4)
JsonResponse中文显示问题

练习:

1 手动创建虚拟环境--用命令
2 往前台返回user字典:[{name:lqz,age:18},{name:lqz2,age:18}]
3 写一个文件上传:如果文件名字重复,不要覆盖,并且放到项目根路径的media文件夹下
def upload(request):
    if request.method == 'GET':
        return render(request,'upload.html')
    elif request.method == 'POST':
        myfile = request.FILES.get('myfile')
        from django.core.files.uploadedfile import InMemoryUploadedFile
        name = myfile.name
        with open('media/%s'%name,'wb') as f:
            for line in myfile:
                f.write(line)
        return HttpResponse('ok')
上传功能

 

posted @ 2018-11-08 20:34  星牧  阅读(320)  评论(0编辑  收藏  举报