zoukankan      html  css  js  c++  java
  • django之路由分组,路由分发,FBV,CBV,ORM框架

    django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容:

    a. 路由系统
        1. 创建app
        2. 路由的分组
        3. 路由的分发
            -   正则表达式匹配
        
    b. django的orm(模型model)
        1. 创建模型的步骤
        2. orm基本的增删改查
        3. 正向查询和反向查询
    

    注意事项:

    1. 前台传给后台一个列表时,后端如何接受:
        request.POST.getlist(字段名)
    
    2. 前台传给后台一个列表时,需要在ajax请求中增加一个参数:
        traditional: true
    
    3. 多选框设置选中状态时,可以使用
        $("select的选择器").val(列表)
    
    4. cookie的参数设置
    
        obj = render(request,'a.html')
        obj.set_cookie(key,values,max_age,expires,path,
    domain,secure,httponly)
    参数详解
    """
    key, 键
    value=, 值
    max_age=None, 超时时间
    expires=None, 指定过期时间IE 专用 date = datetime.datetime() expires=date
    path='/', cookie有效路径
    domain=None, Cookie生效的域名
    secure=False, https传输
    httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    """
    5. 删除Cookie     
    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep
    
    6. 获取Cookie
    username = request.COOKIES.get('username')  # 取出登录用户名
    
    7. cookie的加盐
    #通过加盐的方式为cookie签名。  
        obj.set_signed_cookie('kkk','vvv',  salt='123456') 
    #获取经过签名后的cookie值。
        request.get_signed_cookie('kkk',    salt='123456') 
    
    # 目录结构
    migrations  # 模型操作的迁移文件
    init
    admin       # 管理文件,django admin的时候会用到
    apps        # 应用信息定义文件,在其中生成了类AppCongfig,该类用于定义应用名等Meta数据
    models      # 添加模块层数据类的文件,orm框架时使用
    tests       # 测试代码文件
    views       # 视图文件
    

    路由分组

    对多个视图进行一个分组,比如class为一个组,所有跟class相关的增,删,改,查视图都放在这个app中。各司其职,互不干扰。相比之前把所有的代码写到urls中,功能分划更清晰。
    
    创建app的两种方式:
    
    1. 使用pycharm创建django项目时,可以创建。缺点:只能创建一个
    
    2. 命令行创建python3 manage.py startapp app名称(可创建多个),
    •django使用的什么版本的解释器,就需要用对应的解释器创建app
    •需要在对应的目录下创建
    
    
    分组:
    
    第一种方式
    
    a. 项目下的urls.py中
    from *** import views
    urlpatterns = [
     url(r'^test/', views.test),
    ]
    
    # 缺点,只能导入一个app,多个app会导致名称空间被污染
    
    第二种方式
    1.django项目下的urls.py文件,注意:需要导入include模块
    from django.conf.urls import url,include
    
    urlpatterns = [
      url(r'^classes/',inclued("classes.urls")),
      url(r'^student/',inclued("student.urls")),
      url(r'^teacher/',inclued("teacher.urls"))
    ]
    
    
    1.在对应的app下,创建一个urls.py文件
    
    
    2.对应app的urls.py
    
    form django.conf.urls import url
    
    from classes import views
    
    urlpatterns = [
     url(r'^get_classes/',views.get_classes),
    ]
    1.对应app下的views.py文件内容为:
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    def get_classes(request):
    
       return HttpResponse("get_classes")
    
    第二种方式的总结:
    •客户端访问127.0.0.1:8000/classes/get_classes时,先进入到项目下的urls.py文件进行匹配
    •根据项目下urls.py中的对应关系,进入到各个app项目下的urls.py文件中进行匹配
    •根据各个app下的urls.py中的对应关系,匹配成功请求路径后,执行对应app项目下views.py文件下的函数。
    
    

    路由分发

    from app01 import views
    urlpatterns = [
     url(r'^test/(?P<id>w+)/(?P<name>w+)', views.test),
    ]
    
    
    # app01项目下views.py文件:
    def test(request,name,id):
     print(name)
     print(id)
     return HttpResponse("test")
    
    # 浏览器访问
    http://127.0.0.1:8000/test/0123/plf
    
    # -------------------------views.py中打印结果---------------------
    plf
    0123
    
    

    当浏览器中输入一个不存在的地址时,我们可以在浏览器中匹配对应的路径,然后为不存在的url,专门设置一个页面

    from app01 import views
    urlpatterns = [
     url(r'^', views.notfound),
    ]
    

    反向路由

    当一个路径很长的时候,我们可以在路由系统中,设置一个变量a,用来代替这个路径,之后我们在form表单中action中写入{% url "a" %}即可.

    # 路由系统中的写法
    urlpatterns = [
      url(r'^logindbsjhalbdhaskbhdkjsabhdkbashkdbhsabdhsja/$', views.login, name='test'),
    ]
    
    # 对应的html的页面中写法:
    <form action="/test/" method="post">
        <input type="text">
    </form>
    

    django 中请求处理方式有2种:FBV和CBV

    第一种 FBV(function base views)

    就是在视图里使用函数处理请求

    urls.py

    from django.conf.urls import url, include
    # from django.contrib import admin
    from mytest import views
    
    urlpatterns = [
     # url(r'^admin/', admin.site.urls),
     url(r'^index/', views.index),
    
    views.py
    from django.shortcuts import render
    
    def index(req):
     if req.method == 'POST':
         print('method is :' + req.method)
     elif req.method == 'GET':
         print('method is :' + req.method)
     return render(req, 'index.html')
    

    第二种:CBV(class base views)

    就是在视图里使用类处理请求。

    urls.py

    from mytest import views
    
    urlpatterns = [
     # url(r‘^index/‘, views.index),
     url(r‘^index/‘, views.Index.as_view()),
    ]
    
    # 注:url(r‘^index/‘, views.Index.as_view()),  是固定用法。
    

    views

    from django.views import View
    
    class Index(View):
     def get(self, req):
         print('method is :' + req.method)
         return render(req, 'index.html')
    
     def post(self, req):
         print('method is :' + req.method)
         return render(req, 'index.html')
    
    # 注:类要继承 View ,类中函数名必须小写。
    '''
    'get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'
    form 只支持 post和 get
    ajax 支持 所有的方法
    '''
    
  • 相关阅读:
    项目中正在使用,整理出来的logback配置文件模板
    springboot集成redis 报错@Bean definition illegally overridden by existing bean definition@bean定义被现有bean定义非法重写
    SpringBoot2.0+ 使用Log4j2日志输出
    springboot启动报 A child container failed during start 错误解决过程
    java反射获取和设置实体类的属性值 递归所有父类
    springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发
    SpringBoot整合MongoDB,在多数据源下实现事务回滚。
    spring boot项目开发中遇到问题,持续更新
    identifier of an instance of xx.entity was altered from xxKey@249e3cb2 to xxKey@74e8f4a3; nested exception is org.hibernate.HibernateException: identifier of an instance of xxentity was altered from错误
    Spring Boot启动 Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator错误
  • 原文地址:https://www.cnblogs.com/bladecheng/p/11372263.html
Copyright © 2011-2022 走看看