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 支持 所有的方法
'''

原文地址:https://www.cnblogs.com/bladecheng/p/11372263.html

时间: 2024-08-29 11:11:05

django之路由分组,路由分发,FBV,CBV,ORM框架的相关文章

drf框架, 接口(api) Django FBV =&gt; CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源

接口 """ 接口概念:前台与后台进行信息交互的媒介 - url链接 接口组成: url链接 - 长得像返回数据的url链接 请求方式 - get(查).post(增).put(整体改).patch(局部改).delete(删) 请求参数 - 拼接参数.数据包参数(urlencoded.form-data.json) 响应结果 - 响应的json数据 """ 开发阶段接口测试工具 """ Postman: 官网下载.

Django之请求生命周期及FBV/CBV模式

一.Http请求的过程1.http的请求/响应模式,先是用户通过前端页面发送一个http请求,请求内容包括三部分:请求头/空行/请求体(get方法没有请求体)例如:抓包如下:2.服务端就收到http的请求内容的字符串后,进行解析出相应的请求头(method /url/cookie等信息 )和请求体内容,并将请求体的内容转换成对应的key-value格式.3.服务端再通过url去匹配对应的URL路由(匹配规则是从上向下进行正则匹配,若匹配成功则停止不再向下匹配),匹配成功后找到views中对应的函

Laravel5.1 路由 -路由分组

路由分组有啥好处? 有时候啊 一大堆路由它们都有共同的地方,比如都使用一个中间件(过两天写)或是前缀都一样,避免代码重复 我们可以将他们分到一组中. 1 路由分组可以共享哪些属性? 中间件 middleware. 控制器的命名空间 namespace. 子域名 domain 路由前缀 1.1 中间件 关于中间件大K还没有写笔记介绍,这里先简单说下 中间件就是接收到请求后验证一些东西或相应后验证一些东西,比如Laravel自带的Auth中间件 就是验证用户有没有登录进来,如果用户没用登录,那么就会

Laravel 4 对象化"分组路由"辅助工具

laravel-route-group 对象化分组路由辅助工具 使用前的准备 在 composer.json 文件中申明依赖: "five-say/laravel-route-group": "1.*" 在 /app/config/app.php 中设置"服务提供者"与"别名" 'providers' => array( ... 'FiveSay\LaravelRouteGroup\ServiceProvider', )

laravel路由之分组路由

laravel下的分组路由可以嵌套如下: Route::group(['prefix'=>'admin'],function(){ Route::group(['prefix'=>'dtk'],function(){ Route::get('/getapi','[email protected]'); }); Route::group(['prefix'=>'qtk'],function(){ Route::get('/getapi','[email protected]'); });

徒手撸出一个类Flask微框架(三)根据业务进行路由分组

所谓分组就是按照前缀分布映射 如: /product/(\w+)/(?P<id>\d+        # 匹配/product/123123  的前缀 比如什么类别,类别下的什么产品 等, 用request path进行正则匹配,所以需要用到正则分组 分析我们当前代码,只有__call__方法才是真正在做处理,也就是说得在这个方法获取分组 通过动态属性 通过动态属性,将匹配到的命名分组域当前request对象,因为一个请求对应不同的request实例 这里是一个实例只能对应一个request

Gin框架之路由分组和路由嵌套

路由组也可以嵌套,但是需要注意的是当进行嵌套时下一层的需要调用Group方法(设置路由前缀)是需要用上一层的进行调用: shopGroup := userGroup.Group("/shop") 代码: 1 import ( 2 "github.com/gin-gonic/gin" 3 "net/http" 4 ) 5 6 func main() { 7 r := gin.Default() //设置路由前缀 调用Group方法 8 userGr

网络基础--静态路由+动态路由

说明:在用IP标示各个网络节点后,如果让相隔多个网络节点的两节点通信,需要"中间人"牵线,得一步一步告示某节点数据,要去对端节点一步步怎么走. 静态路由:手工配置静态路由信息,在转发具有匹配目的地址的分组时能够根据路由信息使用专线接口或下一跳IP地址进行转发. 优点:配置简单,占用系统资源少 缺点:大规模网络中配置繁琐,且缺乏灵活性,网络拓扑变更时,路由信息需要手工调整. 动态路由:利用算法和协议,分享和动态学习路由信息 优点:实时性,灵活性,精确性 缺点:资源消耗大,维护成本高 RI

[水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由

问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttribute,然后传一个相关路由模板就可以.属性路由与集中式路由在路由模板含义上基本是一样的,所有路由参数应该使用花括号,同时要与使用的 Action 相匹配.直接式路由支持默认路由,可选参数,约束.详细分析请往下走. 1 [Route("api/teams/{id}")] 2 public