zoukankan      html  css  js  c++  java
  • 子应用中的视图

    import json
    from datetime import datetime
    from django.http import HttpResponse, JsonResponse
    from django.shortcuts import render, redirect
    from django.urls import reverse
    from
    # Create your views here.


    def demo(request):
    return HttpResponse("demo")


    def index(request):
    """
    视图
    1.就是python函数
    2.函数的第一个参数就是 请求 和请求相关的 它是 HttpRequest的实例对象
    3.我们必须要返回一个相应 相应是 HttpResponse的实例对象/子类实例对象
    reverse 就是通过 name 来动态获取路径(路由)
    reverse就是根据起的别名动态返回路径
    如果没有设置namespace 则可以通过name来获取 reverse(name)
    如果有设置namespace 则可以通过namespace:name来获取 reverse(namespace:name)
    # 登陆成功之后需要跳转到首页
    # 注册成功之后需要跳转到首页
    """
    # viewname 通过视图名字
    # 路由是动态获取的
    # path = reverse('index')
    # print(path)
    # 如果我们设置了namespance 这个时候就需要通过 namespace:name 来获取路由
    path = reverse('book:index')
    print(path)
    # 跳转页面
    # 登陆成功之后需要跳转到首页
    # return redirect('/home/')
    # return redirect(path)
    # 注册成功之后需要跳转到首页
    # return redirect('/home/')
    # return redirect(path)

    return HttpResponse("index")


    def detail(request, category_id, book_id):
    # print(category_id, book_id)
    ###########################GET 查询字符串#################################
    """
    https://www.baidu.com/s?ie=utf-8&wd=itcast&rsv_pq=fdf543ed000f8688&rsv_t=8862Eb1lxc9858Ihke7VdJylicTyYs%2F3EuFyVPKcOBnv9wmTxLdhwlYL6%2F8&rqlang=cn&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100
    以? 作为一个分隔
    ?前边 表示 路由
    ?后边 表示 get方式传递的参数 称之为 查询字符串
    ?key=value&key=value...
    我们在登陆的时候会输入用户名和密码 理论上 用户名和密码都应该以POST方式进行传递
    只是为了让大家好理解,我们接下来 用 get方式来传递用户名和密码
    """
    # query_params = request.GET
    # print(query_params)
    # #QueryDict: {'username': ['itcast'], 'password': ['123']}
    #
    # #QueryDict
    # #<QueryDict: {'username': ['itcast', 'itheima'], 'password': ['123']}>
    #
    # # QueryDict 以普通的字典形式来获取 一键多值的是时候 只能获取最后的那一个值
    # # 我们想获取 一键一值的化 就需要使用 QueryDict 的get方法
    # # 我们想获取 一键多值的化 就需要使用 QueryDict 的getlist方法
    # username=query_params['username']
    # password=query_params.get('password')
    #
    # # print(username,password)
    #
    # # print(username)
    #
    # users = query_params.getlist('username')
    # print(users)

    ###########################POST 表单数据#################################

    data = request.POST
    print(data)

    ###########################POST json数据#################################
    """
    JSON 是双引号
    {
    "name":"itcast"
    }
    """

    # print(request.POST)
    # body=request.body
    # b'{ "username":"itcast", "passwrod":"123" }'
    # body_str = body.decode() # JSON形式的字符串
    """
    {
    "username":"itcast",
    "passwrod":"123"
    }
    """
    # print(type(body_str))
    # print('~~~~~~~')
    # print(body_str['username'])

    """
    json
    json.dumps 将字典转换为 JSON形式的字符串
    json.loads 将JSON形式的字符串 转换为字典
    """
    # data = json.loads(body_str)
    # print(data)
    ###########################请求头#################################

    print(request.META)
    #
    content_type = request.META['CONTENT_TYPE']
    print(content_type)

    print(request.method)
    #
    # print('我是有底线的~~~')

    ###########################跳转页面#################################

    # 需求是跳转到首页
    # 通过reverse 这个名字来找到路径
    # path = reverse('book:index')
    # return redirect(path)

    # return redirect('/index/')

    # return redirect('http://www.itcast.cn')

    ###########################JsonResponse#################################
    # from django.http import JsonResponse
    # data = {'name': 'itcast'}

    # return JsonResponse(data)

    ###########################HttpResponse#################################
    # data = {'name': 'itcast'}
    # HttpResponse
    # content 传递字符串 不要传递 对象,字典等数据
    # statue HTTP status code must be an integer from 100 to 599. 只能使用系统规定的
    # content_type 是一个MIME类型
    # 语法形式是: 大类/小类
    # text/html text/css text/javascript
    # application/json
    # image/png image/gif image/jpeg
    # return HttpResponse(data, status=400)
    return HttpResponse("detail")


    """
    保存在客户端的数据叫做 cookie
    0.概念
    1.流程(原理)

    第一次请求过程
    ① 我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
    ② 服务器接收到请求之后,发现 请求中没有任何cookie信息
    ③ 服务器设置一个cookie.这个cookie设置在相应中
    ④ 我们的浏览器接收到这个相应之后,发现相应中有cookie信息,浏览器会将cookie信息保存起来

    第二次及其之后的过程
    ⑤ 当我们的浏览器第二次及其之后的请求都会携带cookie信息
    ⑥ 我们的服务器接收到请求之后,会发现请求中携带的cookie信息,这样的话就认识是谁的请求了

    2.看效果
    3.从http协议角度深入掌握cookie的流程(原理)

    保存在服务器的数据叫做 session

    """


    def set_cookie(request):
    """
    # 第一次请求过程
    # ① 我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
    # ② 服务器接收到请求之后,发现 请求中没有任何cookie信息
    # ③ 服务器设置一个cookie.这个cookie设置在响应中
    # ④ 我们的浏览器接收到这个相应之后,发现相应中有cookie信息,浏览器会将cookie信息保存起来
    """
    # 1. 先判断有没有cookie信息
    # 先假设就是没有
    # request.COOKIES

    # 2.获取用户名
    username = request.GET.get('username')
    # 3. 因为我们假设没有cookie信息,我们服务器就要设置cookie信息
    response = HttpResponse('set_cookie')

    # key,value
    # max_age 单位是秒
    # 时间是 从服务器接收到这个请求时间 + 秒数 计算之后的时间
    response.set_cookie('username', username, max_age=3600)

    # 删除cookie的2种方式
    # response.delete_cookie(key)
    # response.set_cookie(key,value,max_age=0)

    # 4.返回相应
    return response


    def get_cookie(request):
    """

    # 第二次及其之后的过程
    # ⑤ 当我们的浏览器第二次及其之后的请求都会携带cookie信息
    # ⑥ 我们的服务器接收到请求之后,会发现请求中携带的cookie信息,这样的话就认识是谁的请求了

    """

    # 1.服务器可以接收(查看)cookie信息
    cookies = request.COOKIES
    # cookies 就是一个字典
    username = cookies.get('username')

    # 2. 得到用户信息就可以继续其他的业务逻辑了

    return HttpResponse('get_cookie')


    """
    问题1: 我换了浏览器,还能获取到 session信息吗? 不可以

    问题2: 我不换浏览器,删除session id ,则获取不到session数据

    问题3: 再去执行 set_sesison 的时候 会重新生成session id


    保存在服务器的数据叫做 session
    session需要依赖于cookie

    如果浏览器禁用了cookie,则session不能实现

    0.概念
    1.流程

    第一次请求:
    ① 我们第一次请求的时候可以携带一些信息(用户名/密码) cookie中没有任何信息
    ② 当我们的服务器接收到这个请求之后,进行用户名和密码的验证,验证没有问题可以设置session
    信息
    ③ 在设置session信息的同时(session信息保存在服务器端).服务器会在响应头中设置一个 sessionid 的cookie信息(由服务器自己设置的,不是我们设置的)
    ④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)
    第二次及其之后的请求:
    ⑤ 第二次及其之后的请求都会携带 session id信息
    ⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,
    验证成功,则可以获取 session信息(session信息保存在服务器端)
    2.效果
    3.从原理(http)角度

    第一次请求:
    ① 第一次请求,在请求头中没有携带任何cookie信息
    ② 我们在设置session的时候,session会做2件事.
    #第一件: 将数据保存在数据库中
    #第二件: 设置一个cookie信息,这个cookie信息是以 sessionid为key value为 xxxxx
    cookie肯定会以响应的形式在相应头中出现

    第二次及其之后的:

    ③ 都会携带 cookie信息,特别是 sessionid


    """


    def set_session(request):
    """
    第一次请求:
    ① 我们第一次请求的时候可以携带一些信息(用户名/密码) cookie中没有任何信息
    ② 当我们的服务器接收到这个请求之后,进行用户名和密码的验证,验证没有问题可以设置session
    信息
    ③ 在设置session信息的同时(session信息保存在服务器端).服务器会在响应头中设置一个 sessionid 的cookie信息
    ④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)

    """
    # 1.cookie中没有任何信息
    print(request.COOKIES)

    # 2.对用户名和密码进行验证
    # 假设认为 用户名和密码正确
    user_id = 6666

    # 3.设置session信息
    # request.session 理解为字典
    # 设置session的时候其实 session做了2件事
    # 第一件: 将数据保存在数据库中
    # 第二件: 设置一个 cookie信息,这个cookie信息是以 sessionid为key
    request.session['user_id'] = user_id

    # 4. 返回响应
    return HttpResponse('set_session')


    def get_session(request):
    """


    第二次及其之后的请求:
    ⑤ 第二次及其之后的请求都会携带 session id信息
    ⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,
    验证成功,则可以获取 session信息(session信息保存在服务器端)

    """
    # 1. 请求都会携带 session id信息
    print(request.COOKIES)

    # 2. 会获取到sessionid信息,然后进行验证,
    # 验证成功,可以获取 session信息(

    # request.session 字典
    user_id = request.session['user_id']
    user_id = request.session.get('user_id')

    #

    # 3.返回响应
    return HttpResponse('get_session')


    """
    登陆页面
    GET 请求是获取 登陆的页面
    POST 请求是 验证登陆 (用户名和密码是否正确)
    """


    # GET 请求是获取 登陆的页面
    def show_login(request):
    return render(request)


    # POST 请求是 验证登陆 (用户名和密码是否正确)
    def veri_login(request):
    return redirect('首页')


    # 我想由2个视图 变为 1个视图

    def login(request):
    # 我们需要区分业务逻辑
    if request.method == 'GET':
    # GET 请求是获取 登陆的页面
    return render(request)

    else:
    # POST 请求是 验证登陆 (用户名和密码是否正确)
    return redirect('首页')


    """
    面向对象

    类视图 是采用的面向对象的思路

    1.定义类试图
    ① 继承自 View (from django.views import View)
    ② 不同的请求方式 有不同的业务逻辑
    类试图的方法 就直接采用 http的请求方式的名字 作为我们的函数名.例如: get ,post,put,delete
    ③ 类试图的方法的第二个参数 必须是请求实例对象、必須是request
    类试图的方法 必须有返回值 返回值是HttpResopnse及其子类

    2.类试图的url引导
    """
    from django.views import View


    class BookView(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('oooo')


    class Person(object):

    # cls 是谁? --> Person 类
    @classmethod
    def say(cls):
    pass

    # self 是谁? --> 实例对象
    def eat(self):
    pass

    @staticmethod
    def run():
    pass


    Person.say()

    p = Person()
    p.eat()

    """
    个人中心页面 -- 必须登陆才能显示
    GET 方式 展示 个人中心
    POST 实现个人中心信息的修改
    定义类视图
    """
    from django.contrib.auth.mixins import LoginRequiredMixin


    class CenterView(LoginRequiredMixin, View):

    def get(self, request):
    return HttpResponse('个人中心展示')

    def post(self, request):
    return HttpResponse('个人中心修改')


    #############################模板############################################

    class HomeView(View):

    def get(self, request):
    # 1.获取数据
    username = request.GET.get('username')

    # 2.组织数据
    context = {
    'username': username,
    'age': 14,
    'birthday': datetime.now(),
    'firends': ['tom', 'jack', 'rose'],
    'money': {
    '2019': 12000,
    '2020': 18000,
    '2021': 25000,
    },
    'desc': '<script>alert("hot")</script>'
    }

    # return render(request,'detail.html')
    return render(request, 'index.html', context=context)
  • 相关阅读:
    wxpython 文本框TextCtrl
    python py文件转换成exe
    安装NTP到CentOS(YUM)
    安装NFS到CentOS(YUM)
    安装MongoDB到Ubuntu(APT)
    安装MongoDB到CentOS(YUM)
    安装Mailx到CentOS(YUM)
    安装MYSQL到Ubuntu(APT)
    安装MYSQL到CentOS(YUM)
    安装Kubernetes到CentOS(Minikube)
  • 原文地址:https://www.cnblogs.com/zhang-da/p/14483627.html
Copyright © 2011-2022 走看看