威尼斯人线上娱乐

Go完结短url项指标措施言传身教,Django框架第3篇基础

8 6月 , 2019  

第三说一下这种事情的选择场景:
一.把八个长url调换为三个短url网址
二.主要用来和讯,二维码,等有字数限制的光景

翻阅目录

3个小标题:

Django Web 框架来做Web(接口)开荒,能源丰硕。

注重达成的功效分析:
1.把长url的地址转变为短url地址
贰.透过短url获取相应的原始长url地址
叁.等同长url地址是不是必要平等的短url地址

  Django基本命令

怎么是根目录:就是从未渠道,只有域名、。url(r’^$’)

法定提出在Python三 的新颖版本下利用Django。

此间完结的是3个api服务

  视图层路由安顿类别

补充一张有关wsgiref模块的图形

Django
官网:

威尼斯人线上娱乐 1

  视图层之视图函数

威尼斯人线上娱乐 2

Windows 安装Django

pip3 install django==1.10.3

数据库设计

 

 

第一个Django项目

数据库的宏图其实也不曾非常复杂,如图所示:

MTV模型

一、MTV模型

创制项目

只要你已经成功的安装Django,在…/python35/Scripts/目录团长会多出2个django-admin.exe
文件。在Windows 命令提醒符下输入“django-admin”命令回车。
威尼斯人线上娱乐 3

这里罗列了Django
所提需要大家的通令,当中使用“startproject”命令来创建项目。

D:\Doc\django   #切换到项目目录
λ django-admin startproject guest  #创建guest项目

 创制之后,目录结构如下:

威尼斯人线上娱乐 4

guest/settings.py:Django 项目标布局文件,包含Django
模块应用配置,数据库配置,模板配置等。
guest/urls.py:Django 项目的URL 声明。
guest/wsgi.py:为WSGI 包容的Web 服务器服务项目标切入点。
manage.py:3个命令行工具,能够令你在使用Django
项目时以差异的点子张开互动。

威尼斯人线上娱乐 5

Django的M彩电分别代表:

Django的MTV分别代表:

创设应用

行使“startapp”命令成立应用。三个品种能够包括八个使用,而作者辈要付出的记名系统应该在现实接纳上面实现。

D:\Doc\django\guest
λ python3 manage.py startapp sign

 制造之后,目录结构如下:

威尼斯人线上娱乐 6

migrations/:用于记录models 中多少的转移。
admin.py:映射models 中的数据到Django 自带的admin 后台。
apps.py:在新的Django 版本中新扩展,用于应用程序的布局。
models.py:创建应用程序数据表模型(对应数据库的相干操作)。
tests.py:创建Django 测试。
views.py:调节向前端显示怎么数据。

那边有个设置要求珍重正是关于数据库表中id的计划,需求设置为自增的

  Model(模型):肩负作业对象与数据库的靶子(OTucsonM)

  Model(模型):和数据库相关的,负担作业对象与数据库的对象(OBMWX5M)

运维品种

Django 提供了Web
容器,只供给通过“runserver”命令就足以把品种运作起来,暗中同意会通过本机的七千端口来运维项目,打开浏览器,访问:

python3 manage.py runserver

运营时能够钦命IP 地址和端口号,展开浏览器,访问:

python3 manage.py runserver 127.0.0.1:8001

并且这里有个难点亟需超前知道,我们的思路是根据id的值会转变为6二进制关于进制调换的代码为:

  Template(模板):担任什么把模版显示给用户

  Template(模板):放全部的html文件

创建Hello Django页面

①、配置guest/settings.py 文件,将sign 应用增加到花色中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sign',  # 添加sign应用
]

二、命名3个/index/路线,配置guest/guest/urls.py文件,加多路由

from django.conf.urls import url
from django.contrib import admin
from sign import views  # 导入sign 应用views 文件

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$', views.index),  # 添加index/路径配置
]

3、打开guest/sign/views.py,创建index函数

 

from django.http import HttpResponse


# Create your views here.
def index(request):
    return HttpResponse("Hello Django!")

Go完结短url项指标措施言传身教,Django框架第3篇基础。HttpResponse 类存在django.http.HttpResponse
中,以字符串的样式传递给前端页面数据。

四、运转项目,展开
Diango!”页面,第3个Diango程序运维成功。

威尼斯人线上娱乐 7

// 将十进制转换为62进制  0-9a-zA-Z 六十二进制
func transTo62(id int64)string{
  // 1 -- > 1
  // 10-- > a
  // 61-- > Z
  charset := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  var shortUrl []byte
  for{
    var result byte
    number := id % 62
    result = charset[number]
    var tmp []byte
    tmp = append(tmp,result)
    shortUrl = append(tmp,shortUrl...)
    id = id / 62
    if id == 0{
      break
    }
  }
  fmt.Println(string(shortUrl))
  return string(shortUrl)
}

  View(视图):担任作业逻辑,并在适龄的时候调用Model和Template四

           模板语法:目标是将白变量(数据库的原委)怎样美妙的停放到html页面中

 使用模板

方今要用HTML 页面来代替“Hello
Django!”字符串,那么管理形式也会迥然差异。

一、在选拔sign/目录下制造templates/index.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django Page</title>
</head>
<body>
    <h1>Hello Django!</h1>
</body>
</html>

贰、修改视图像和文字件views.py

from django.shortcuts import render


# Create your views here.
def index(request):
    return render(request, "index.html")

这一次使用Django 的render
函数。该函数的率先个参数是伸手对象,第二个参数重回2个index.html 页面。

 3、刷新页面,看到修改后的页面

从而那边供给设置一下数据库id的伊始值,能够安装的大学一年级点,那样转变为62进制之后不至于太短

  其它,Django还应该有贰个urls分发器,它的作用是将2个个U凯雷德L的页面请求分发给不相同的view管理,view再调用相应的Model和Template

  View(视图):担当作业逻辑,并在适合的时候调用Model和Template

 Django 工作流

威尼斯人线上娱乐 8

代码逻辑

威尼斯人线上娱乐 9

  别的,Django还或然有三个U奥迪Q5L分发器。它的成效是将2个个U君越L的页面请求分别发放区别的Views管理,Views再调用相应的Model和Template。

 

类型总体的代码git地址:
理之当然这里的代码还恐怕有待前边继续做优化,可是这里通过golang内置的net/http
库实现了八个轻易易行的api成效

  

威尼斯人线上娱乐 10

关于URLconf

代码的目录结构

Django基本命令

威尼斯人线上娱乐 11

一、Django管理三个伸手的进度如下:

(一)Django使用的是根U科雷傲Lconf模块。这些值日常通过ROOT_URLCONF设置(在…/settings.py中)

(二)Django加载U大切诺基Lconf模块(url.py文件),并物色可用的urlpatterns

(三)Django依次相配每一个U大切诺基L情势,在于请求的UCRUISERL相配的首先个形式处停下来

威尼斯人线上娱乐 ,(四)一档当中 3个正则说明式相配上,则Django见请求指向对应的图谋函数处理

(伍)如若没哟相称到,恐怕经过中抛出非常,那Django将调用二个确切的错误管理视图。

|____logic
| |____logic.go
|____model
| |____data.go
|____api
| |____api.go
|____client
| |____client.go

1、下载Django:

1
pip3 install django

二、Django基本命令

2、关于urls.py的配置

前面urls.py的布署,使用python的正则表明式

r'^index/$'

r  字符串前边加“ r ”是为了防止万一字符串中冒出类似“\t”字符时被转义

^  相配起来

$  匹配结尾

 通过^index/$ 相配到/index/目录。并且将管理指向sign
应用的视图像和文字件views.py 的index 函数

logic目录为机要的拍卖逻辑
model是概念了request和response结构体
api目录为顺序的输入程序
client 为测试请求,实行地址的转变

2、成立一个django project

1
django-admin.py startproject mysite

 当前目录下会生成mysite的工程,目录结构如下:

        威尼斯人线上娱乐 12

  • manage.py —– Django项目里面包车型大巴工具,通过它能够调用django shell和数据库等。
  • settings.py —- 包罗了花色的暗中认可设置,包涵数据库信息,调节和测试标记以及别的一些办事的变量。
  • urls.py —– 负担把U奥迪Q5L形式映射到应用程序。

1、下载Django:

Views视图

接下去请求的拍卖就到了…/sign/views.py 中的index 视图函数。如图

 威尼斯人线上娱乐 13

视图函数,简称视图,是一个简易的python函数,它承受web请求并赶回web响应,响应得以是一张HTML网页、三个重定向、一个40四漏洞非常多、一张图片等。

model 代码为:

三、在mysite目录下创办应用

1
python manage.py startapp blog

        威尼斯人线上娱乐 14

pip3 install django

templates 模板

打开…/sign/templates/index.html 文件。如图

威尼斯人线上娱乐 15

作为Web框架,Django须求1种卓殊便于的章程动态生成HTML。最遍布的做法是采用模板,模板包涵HTML、CSS、JS等。

package model


type Long2ShortRequest struct {
  OriginUrl string `json:"origin_url"`
}

type ResponseHeader struct {
  Code int `json:"code"`
  Message string `json:"message"`
}

type Long2ShortResponse struct {
  ResponseHeader
  ShortUrl string `json:"short_url"`
}

type Short2LongRequest struct {
  ShortUrl string `json:"short_url"`
}

type Short2LongResponse struct {
  ResponseHeader
  OriginUrl string `json:"origin_url"`
}

4、启动django项目

1
python manage.py runserver 8080

     
 那样大家的django就开动起来了!当我们走访:

       威尼斯人线上娱乐 16

二、成立1个Django对象

M电视开采方式

logic的代码为:

伍、同步转移数据库表或字段

威尼斯人线上娱乐 17

'''
    python manage.py syncdb

    注意:Django 1.7.1 及以上的版本需要用以下命令
    python manage.py makemigrations
    python manage.py migrate

'''

威尼斯人线上娱乐 18

这种情势能够创造表,当你在models.py中新添了类时,运营它就足以活动在数据库中开创表了,不用手动创制。

django-admin.py  startproject   项目名称

django-admin.py  startproject    mysite

MVC模式

把数据存取逻辑、业务逻辑和显示逻辑组合在联合的概念有的时候被叫作软件架构的Model-View-Controller(MVC)格局。
M ,数据存取部分,由Django 数据库层拍卖

V ,选择显示怎么数据要体现以及怎么样呈现的局地

C ,依据用户输入委派视图的一些,由Django 框架依照UHummerH贰Lconf 设置,对给定U奔驰M级L
调用适当的Python 函数

package logic

import(
  "go_dev/11/short_url/model"
  "github.com/jmoiron/sqlx"
  "fmt"
  "crypto/md5"
  "database/sql"
)

var (
  Db *sqlx.DB
)

type ShortUrl struct {
  Id int64 `db:"id"`
  ShortUrl string `db:"short_url"`
  OriginUrl string `db:"origin_url"`
  HashCode string `db:"hash_code"`
}

func InitDb(dsn string)(err error) {
  // 数据库初始化
  Db, err = sqlx.Open("mysql",dsn)
  if err != nil{
    fmt.Println("connect to mysql failed:",err)
    return
  }
  return
}

func Long2Short(req *model.Long2ShortRequest) (response *model.Long2ShortResponse, err error) {
  response = &model.Long2ShortResponse{}
  urlMd5 := fmt.Sprintf("%x",md5.Sum([]byte(req.OriginUrl)))
  var short ShortUrl
  err = Db.Get(&short,"select id,short_url,origin_url,hash_code from short_url where hash_code=?",urlMd5)
  if err == sql.ErrNoRows{
    err = nil
    // 数据库中没有记录,重新生成一个新的短url
    shortUrl,errRet := generateShortUrl(req,urlMd5)
    if errRet != nil{
      err = errRet
      return
    }
    response.ShortUrl = shortUrl
    return
  }
  if err != nil{
    return
  }
  response.ShortUrl = short.ShortUrl
  return
}

func generateShortUrl(req *model.Long2ShortRequest,hashcode string)(shortUrl string,err error){
  result,err := Db.Exec("insert INTO short_url(origin_url,hash_code)VALUES (?,?)",req.OriginUrl,hashcode)
  if err != nil{
    return
  }
  // 0-9a-zA-Z 六十二进制
  insertId,_:= result.LastInsertId()
  shortUrl = transTo62(insertId)
  _,err = Db.Exec("update short_url set short_url=? where id=?",shortUrl,insertId)
  if err != nil{
    fmt.Println(err)
    return
  }
  return
}

// 将十进制转换为62进制  0-9a-zA-Z 六十二进制
func transTo62(id int64)string{
  // 1 -- > 1
  // 10-- > a
  // 61-- > Z
  charset := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  var shortUrl []byte
  for{
    var result byte
    number := id % 62
    result = charset[number]
    var tmp []byte
    tmp = append(tmp,result)
    shortUrl = append(tmp,shortUrl...)
    id = id / 62
    if id == 0{
      break
    }
  }
  fmt.Println(string(shortUrl))
  return string(shortUrl)
}


func Short2Long(req *model.Short2LongRequest) (response *model.Short2LongResponse, err error) {
  response = &model.Short2LongResponse{}
  var short ShortUrl
  err = Db.Get(&short,"select id,short_url,origin_url,hash_code from short_url where short_url=?",req.ShortUrl)
  if err == sql.ErrNoRows{
    response.Code = 404
    return
  }
  if err != nil{
    response.Code = 500
    return
  }
  response.OriginUrl = short.OriginUrl
  return
}

陆、清空数据库

1
python manage.py flush

 此命令会询问是 yes 照旧 no, 选用 yes
会把多少总体清空掉,只留下空表。

开创成功后会生成那样3个工程。目录结构如下:

MTV模式

出于C 由框架自行管理,而Django
里更关爱的是模型(Model)、模板(Template)和视图(Views),Django
也被称作MTV 框架。在MTV 开荒格局中:

M 代表模型(Model),即数据存取层。该层管理与数占领关的兼具事情:
怎么着存取、怎么着表明有效

T 代表模板(Template),即表现层。该层管理与表现存关的决定:
怎么样在页面或任何品种文书档案中展开始展览示

V
代表视图(View),即职业逻辑层。该层包蕴存取模型及调取伏贴模板的有关逻辑。你能够把它看做模型与模板之间的桥梁。

  

  

api的代码为:

7、成立超级助理馆员

威尼斯人线上娱乐 19

'''
    python manage.py createsuperuser

    # 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填

    # 修改 用户密码可以用:
    python manage.py changepassword username

'''

威尼斯人线上娱乐 20

威尼斯人线上娱乐 21

package main

import (
  "io/ioutil"
  "net/http"
  "fmt"
  "encoding/json"
  "go_dev/11/short_url/logic"
  "go_dev/11/short_url/model"
  _ "github.com/go-sql-driver/mysql"
)

const (
  ErrSuccess = 0
  ErrInvalidParameter = 1001
  ErrServerBusy = 1002
)

func getMessage(code int) (msg string){
  switch code {
  case ErrSuccess:
    msg = "success"
  case ErrInvalidParameter:
    msg = "invalid parameter"
  case ErrServerBusy:
    msg = "server busy"
  default:
    msg = "unknown error"
  }

  return
}

// 用于将返回序列化数据,失败的返回
func responseError(w http.ResponseWriter, code int) {
  var response model.ResponseHeader
  response.Code = code
  response.Message = getMessage(code)

  data, err := json.Marshal(response)
  if err != nil {
    w.Write([]byte("{\"code\":500, \"message\": \"server busy\"}"))
    return
  }

  w.Write(data)
}

// 用于将返回序列化数据,成功的返回
func responseSuccess(w http.ResponseWriter, data interface{}) {


  dataByte, err := json.Marshal(data)
  if err != nil {
    w.Write([]byte("{\"code\":500, \"message\": \"server busy\"}"))
    return
  }

  w.Write(dataByte)
}

// 长地址到短地址
func Long2Short(w http.ResponseWriter, r *http.Request) {
  // 这里需要说明的是发来的数据是通过post发过来一个json格式的数据
  data, err := ioutil.ReadAll(r.Body)
  if err != nil {
    fmt.Println("read all failded, ", err)
    responseError(w, 1001)
    return
  }

  var req model.Long2ShortRequest
  // 将反序列化的数据保存在结构体中
  err = json.Unmarshal(data, &req)
  if err != nil {
    fmt.Println("Unmarshal failded, ", err)
    responseError(w, 1002)
    return
  }

  resp, err := logic.Long2Short(&req)
  if err != nil {
    fmt.Println("Long2Short failded, ", err)
    responseError(w, 1003)
    return
  }

  responseSuccess(w, resp)
}

// 短地址到长地址
func Short2Long(w http.ResponseWriter, r *http.Request) {
  // 这里需要说明的是发来的数据是通过post发过来一个json格式的数据
  data, err := ioutil.ReadAll(r.Body)
  if err != nil {
    fmt.Println("read all failded, ", err)
    responseError(w, 1001)
    return
  }

  var req model.Short2LongRequest
  // 将反序列化的数据保存在结构体中
  err = json.Unmarshal(data, &req)
  if err != nil {
    fmt.Println("Unmarshal failded, ", err)
    responseError(w, 1002)
    return
  }

  resp, err := logic.Short2Long(&req)
  if err != nil {
    fmt.Println("Long2Short failded, ", err)
    responseError(w, 1003)
    return
  }
  responseSuccess(w, resp)
}

func main(){
  err := logic.InitDb("root:123456@tcp(192.168.50.145:3306)/short_url?parseTime=true")
  if err != nil{
    fmt.Printf("init db failed,err:%v\n",err)
    return
  }
  http.HandleFunc("/trans/long2short", Long2Short)
  http.HandleFunc("/trans/short2long", Short2Long)
  http.ListenAndServe(":18888", nil)
}

8、Django 项目条件终端

1
python manage.py shell

这几个命令和 直接运维 python 进入 shell 的分别是:你可以在那些 shell
里面调用当前项指标 models.py 中的 API,对于操作数据的测试特别便宜。

  • manage.py——运维文件
    (Django项目里面包车型客车工具,通过它能够调用Django
    shell的数码和数据库等)
  • settings.py——包涵了项目标部分设置,包括数据库音讯、调节和测试标识以及别的一些职业的变量。
  • urls.py———–路线与视图函数的照射关系

小结

九、Django 项目碰到终端

ython manage.py dbshell

Django 会自动进入在settings.py中设置的数据库,若是是 MySQL 或
postgreSQL,会供给输入数据库用户密码。

在那些极限能够施行数据库的SQL语句。倘令你对SQL相比较熟稔,或许喜欢这种方式。

三、创造四个运用

此次经过那几个小代码对go也会有了3个方始的认知和动用,同时也由此net/http
包达成了api的机能,也对其主旨使用有了大约了然

10、更加多命令

1
python manage.py

 查看全部的一声令下,忘记子名称的时候特别有用。

python3 manage.py startapp blog(应用名称)                                        

以上正是本文的全部内容,希望对大家的读书抱有补助,也期望大家多多扶助脚本之家。

11 静态文件配置

威尼斯人线上娱乐 22

概述:

     静态文件交由Web服务器处理,Django本身不处理静态文件。简单的处理逻辑如下(以nginx为例):

              URI请求-----> 按照Web服务器里面的配置规则先处理,以nginx为例,主要求配置在nginx.
                             conf里的location

                         |---------->如果是静态文件,则由nginx直接处理

                         |---------->如果不是则交由Django处理,Django根据urls.py里面的规则进行匹配

    以上是部署到Web服务器后的处理方式,为了便于开发,Django提供了在开发环境的对静态文件的处理机制,方法是这样:

威尼斯人线上娱乐 23

static配置:

STATIC首要指的是如css,js,images那样文件:

威尼斯人线上娱乐 24

STATIC_URL = '/static/'      # 别名
STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"static"),  #实际名 ,即实际文件夹的名字
        )

'''

注意点1:
 django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找
        <script src="/statics/jquery-3.1.1.js"></script>
        ------error-----不能直接用,必须用STATIC_URL = '/static/':
        <script src="/static/jquery-3.1.1.js"></script>

注意点2:
 STATICFILES_DIRS = (
    ("app01",os.path.join(BASE_DIR, "app01/statics")),
        )

 <script src="/static/app01/jquery.js"></script>

'''

威尼斯人线上娱乐 25

have a try:

http://127.0.0.1:8000/static/jquery.js

media配置:

威尼斯人线上娱乐 26

# in settings:

MEDIA_URL="/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload")

# in urls:
from django.views.static import serve
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),

威尼斯人线上娱乐 27

 have
a
try:                                                                        重临顶端

http://127.0.0.1:8000/media/1.png

威尼斯人线上娱乐 28威尼斯人线上娱乐 29

'''
        静态文件的处理又包括STATIC和MEDIA两类,这往往容易混淆,在Django里面是这样定义的:

        MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义

        MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上传的文件就会被保存到c:\temp\media\abc

        eg:
            class blog(models.Model):
                   Title=models.charField(max_length=64)
                   Photo=models.ImageField(upload_to="photo")
          上传的图片就上传到c:\temp\media\photo,而在模板中要显示该文件,则在这样写
          在settings里面设置的MEDIA_ROOT必须是本地路径的绝对路径,一般是这样写:
                 BASE_DIR= os.path.abspath(os.path.dirname(__file__))
                 MEDIA_ROOT=os.path.join(BASE_DIR,'media/').replace('\\','/')

        MEDIA_URL是指从浏览器访问时的地址前缀,举个例子:
            MEDIA_ROOT=c:\temp\media\photo
            MEDIA_URL="/data/"
        在开发阶段,media的处理由django处理:

           访问http://localhost/data/abc/a.png就是访问c:\temp\media\photo\abc\a.png

           在模板里面这样写<img src="/media/abc/a.png">

           在部署阶段最大的不同在于你必须让web服务器来处理media文件,因此你必须在web服务器中配置,
           以便能让web服务器能访问media文件
           以nginx为例,可以在nginx.conf里面这样:

                 location ~/media/{
                       root/temp/
                       break;
                    }

           具体可以参考如何在nginx部署django的资料。


           '''

View Code

始建成功后会生成那样1个工程。目录结构如下:

你或然感兴趣的小说:

  • Django静态财富UCR-VL
    STATIC_ROOT的配备方式
  • Django中U中华VLconf和include()的协同职业方法
  • Django
    UTiguanL传递参数的措施总括
  • python三选取urllib示例取googletranslate(谷歌(谷歌(Google))翻译)
  • go语言落成1个简易的http客户端抓取远程url的法子
  • Django中U兰德陆风X8L视图函数的一对高级概念介绍
  • Django中传递参数到UXC90Lconf的视图函数中的方法
  • Python中Django框架利用url来支配登陆的不二等秘书诀
  • 在Django的UPRADOLconf中动用命名组的法子

视图层之路由安顿类别(views)

U猎豹CS陆L配置(U君越Lconf)就好像Django
所支撑网址的目录。它的精神是U昂科雷L与要为该U兰德瑞鹰L调用的视图函数之间的映射表;你便是以这种艺术告知Django,对于那个U哈弗L调用这段代码,对于丰裕U奥迪Q5L调用这段代码。

    '''

    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
]


参数说明:

    一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数

    '''

威尼斯人线上娱乐 30

二.1 U昂科威Lconf的正则字符串参数

 4、启动Django项目

二.1.1 轻便安插

威尼斯人线上娱乐 31

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

威尼斯人线上娱乐 32

威尼斯人线上娱乐 33

    '''
    NOTE:
    1 一旦匹配成功则不再继续
    2 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
    3 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    4 每个正则表达式前面的'r' 是可选的但是建议加上。

一些请求的例子:

    /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
    /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
    /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
                       views.month_archive(request, '2005', '03')。
    '''

威尼斯人线上娱乐 34

威尼斯人线上娱乐 35

#设置项是否开启URL访问地址后面不为/跳转至带有/的路径
APPEND_SLASH=True
python3 manage.py runserver  8080

二.一.2 有名分组(named group)

地点的演示使用轻巧的、未有命名的正则表达式组(通过圆括号)来捕获U汉兰达L
中的值并以地点参数字传送递给视图。在越来越高端的用法中,能够接纳命名的正则表明式组来捕获UTiggoL
中的值并以关键字 参数字传送递给视图。

在Python
正则说明式中,命名正则表明式组的语法是(?P<name>pattern),其中name 是组的称号,pattern是要合营的情势。

上面是上述UCR-VLconf 使用命名组的重写:

威尼斯人线上娱乐 36

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

威尼斯人线上娱乐 37

以此达成与前方的演示大同小异,唯有二个细小的反差:捕获的值作为根本字参数而不是岗位参数字传送递给视图函数。举例:

    /articles/2005/03/    
    请求将调用views.month_archive(request, year='2005', month='03')函数
    /articles/2003/03/03/ 
    请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。

在其实使用中,那象征你的U昂科威Lconf 会越发分明且不轻便发生参数顺序难题的一无可取——
你可以在你的视图函数定义中重新布置参数的次第。当然,那些利润是以简要为代价;有个别开拓人士认为命名组语法丑陋而麻烦。

如此大家的django就开动起来了!当大家走访:

贰.一.三 UCRUISERLconf 在怎么上寻觅

UPRADOLconf 在伸手的U帕杰罗L 上追寻,将它看成贰个一般的Python
字符串。不包含GET和POST参数以及域名。

例如, 请求中,URLconf 将查找myapp/

在 请求中,U大切诺基Lconf
仍将追寻myapp/

UGL450Lconf 不检讨请求的主意。换句话讲,全体的伸手方法 ——
同1个UEvoqueL的POSTGETHEAD等等 —— 都将路由到均等的函数。

威尼斯人线上娱乐 38

2.一.4 捕获的参数永久是字符串

种种捕获的参数都看作二个普通的Python
字符串传递给视图,无论正则表明式使用的是如何相配格局。比如,上边那行URAV4Lconf
中:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

views.year_archive() 的year 参数将是3个字符串

⑤、创制表命令

二.1.5 内定视图参数的默许值

有二个福利的小能力是钦点视图参数的暗中同意值。 上边是2个U奥迪Q3Lconf
和视图的言传身教:

威尼斯人线上娱乐 39

# URLconf
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]

# View (in blog/views.py)
def page(request, num="1"):

    ...

威尼斯人线上娱乐 40

在上头的例子中,多个UBMWX三L情势指向同八个视图views.page —— 不过第三个情势不会从U奥迪Q5L
中捕获任何值。若是第1个情势相称,page() 函数将应用num参数的默许值”壹”。如若第二个格局相配,page() 将动用正则表明式捕获的num 值。

python3 manage.py makemigrations

python3 manage.py migrate

2.1.6 Including other URLconfs

威尼斯人线上娱乐 41

#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.

#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:


from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),
]

威尼斯人线上娱乐 42

 

二.二 传递额外的选项给视图函数(精晓)

U福特ExplorerLconfs 具有二个钩子,让您传递2个Python
字典作为额外的参数字传送递给视图函数。

django.conf.urls.url() 函数尚可2个可选的第二个参数,它是1个字典,表示想要传递给视图函数的附加关键字参数。

例如:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

在那些例子中,对于/blog/2005/请求,Django
将调用views.year_archive(request, year='2005', foo='bar')

这几个手艺在Syndication 框架中应用,来传递元数据和选取给视图。

6

2.三 UCR-VL 的反向深入分析

在选取Django 项目时,二个普及的需若是获取USportageL
的末梢方式,以用来放置到变化的内容中(视图大壮展现给用户的ULANDL等)或然用于拍卖服务器端的导航(重定向等)。

大千世界精晓希望不用硬编码那些ULX570L(费劲、不可扩张且轻巧发生错误)大概安插一种与U冠道Lconf
毫无干系的极度的U猎豹CS陆L 生成机制,因为那样便于产生一定水准上爆发超时的U昂CoraL。

换句话讲,须求的是2个D君越Y 机制。除了其它有一些,它还同意陈设的U瑞虎L
能够自动更新而不用遍历项目标源代码来查找并替换过期的U酷路泽L。

赢得3个U奇骏L
最开头想到的新闻是拍卖它视图的标志(比如名字),查找精确的UQX56L
的任何要求的音信有视图参数的品种(地点参数、关键字参数)和值。

Django 提供叁个艺术是让UENVISIONL 映射是U奥迪Q伍L
设计唯1的地点。你填充你的U奥迪Q五Lconf,然后能够双向使用它:

  • 听说用户/浏览器发起的UCRUISERL 请求,它调用正确的Django 视图,并从U奇骏L
    中领到它的参数须求的值。
  • 依照Django 视图的标记和将要传递给它的参数的值,获取与之提到的U中华VL。

首先种方法是我们在日前的章节中一直商量的用法。第几种艺术叫做反向解析URL、反向USportageL
相配、反向U奥德赛L 查询大概轻松的U纳瓦拉L 反查。

在急需UCR-VL 的地点,对于区别层级,Django 提供分裂的工具用于U凯雷德L 反查:

  • 在模板中:使用url 模板标签。
  • 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
  • 在越来越高层的与拍卖Django
    模型实例相关的代码中:使用get_absolute_url() 方法。

例子:

思虑下边包车型客车UBMWX三Lconf:

威尼斯人线上娱乐 43

from django.conf.urls import url

from . import views

urlpatterns = [
    #...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
]

威尼斯人线上娱乐 44

传闻这里的规划,某一年nnnn对应的存档的U本田UR-VL是/articles/nnnn/

你能够在模板的代码中采取下边的方法获得它们:

威尼斯人线上娱乐 45

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

威尼斯人线上娱乐 46

在Python 代码中,那样使用:

威尼斯人线上娱乐 47

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

威尼斯人线上娱乐 48

倘假如因为某种原因决定按年归档小说揭露的U奥迪Q5L应该调解一下,那么你将只要求修改UEnclaveLconf
中的内容。

在好几场景中,三个视图是通用的,所以在U途达L
和视图之间存在多对一的涉及。对于那一个境况,当反查U大切诺基L
时,唯有视图的名字还相当不足。

7、

2.4 命名URL 模式

为了产生地点例子中的U智跑L 反查,你将要求利用命名的U途观L 形式。UGL450L
的名目使用的字符串能够涵盖其余你喜欢的字符。不仅限制在合法的Python
名称。

当命名你的UPAJEROL
形式时,请确认保障使用的名目不会与其它应用中名称争辨。假若你的U帕杰罗L
形式叫做comment,而别的二个选用中也可以有八个一样的名目,当您在模板中运用这几个称谓的时候不可能保证将插入哪个UPAJEROL。

在U兰德昂科威L
名称中拉长一个前缀,比方选择的名目,将核减争执的或然。大家提议选用myapp-comment 而不是comment

8、

2.5 CBV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
url(r'^login.html$', views.Login.as_view()),
 
============================
from django.views import View
class Login(View):
     
    def dispatch(self, request, *args, **kwargs):
        print('before')
        obj = super(Login,self).dispatch(request, *args, **kwargs)
        print('after')
        return obj
 
    def get(self,request):
        
        return render(request,'login.html')
 
    def post(self,request):
        print(request.POST.get('user'))
        return HttpResponse('Login.post')

 

9、

视图层之视图函数(views)

2个视图函数,简称视图,是1个轻松的Python
函数,它接受Web请求并且重返Web响应。响应得以是一张网页的HTML内容,八个重定向,贰个40四荒唐,一个XML文书档案,也许一张图片.
. . 是此外东西都能够。无论视图本人包涵怎样逻辑,都要回到响应。代码写在哪儿也不在乎,只要它在你的Python目录上边。除外未有更加的多的渴求了——能够说“未有何奇妙的地点”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名称叫views.py的文书中。

10、待续

1个粗略的视图 

下边是四个回去当前些天期和时间作为HTML文书档案的视图:

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

让大家逐行阅读方面包车型客车代码:

  • 首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。

  • 继而,大家定义了current_datetime函数。它就是视图函数。每一种视图函数都接纳HttpRequest指标作为第一个参数,并且普通称为request

    留神,视图函数的称号并不首要;不供给用叁个联结的命名方式来命名,以便让Django识别它。我们将其取名称叫current_datetime,是因为这几个称呼能够规范地展现出它的效应。

  • 其一视图会重回三个HttpResponse目的,当中包蕴生成的响应。各样视图函数都承担再次回到叁个HttpResponse对象。

三、视图层之路由布署种类(views)

          威尼斯人线上娱乐 49

U揽胜极光L配置(U汉兰达Lconf)就像是Django所支撑网址的目录。它的精神是URubiconL与要为该U翼虎L调用的视图函数之间的映射表;

HttpRequest对象

属性:

威尼斯人线上娱乐 50

'''
path:       请求页面的全路径,不包括域名

method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如

               if  req.method=="GET":

                         do_something()

               elif req.method=="POST":

                         do_something_else()

GET:         包含所有HTTP GET参数的类字典对象

POST:       包含所有HTTP POST参数的类字典对象

COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。

FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
             name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

             filename:      上传文件名,用字符串表示
             content_type:   上传文件的Content Type
             content:       上传文件的原始内容


user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
             没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
             可以通过user的is_authenticated()方法来辨别用户是否登陆:
             if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
             时该属性才可用

session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

'''

威尼斯人线上娱乐 51

方法:

1
get_full_path()

小心:键值对的值是多少个的时候,比如checkbox类型的input标签,select标签,须要用:

1
request.POST.getlist("hobby")

您便是以这种方法告诉Django,对于那些U汉兰达L调用这段代码,对于丰富U智跑L调用这段代码。

render 函数

render(request,
template_name[, context])

结合一个加以的沙盘和三个加以的上下文字典,并回到2个渲染后的
HttpResponse 对象。

参数:
     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

     content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

     status:响应的状态码。默认为200。
   '''

    urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
]


参数说明:

    一个正则表达式字符串
    一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数

    '''

redirect 函数

参数能够是:

  • 叁个模型:将调用模型的get_absolute_url() 函数
  • 一个视图,能够包含参数:将应用urlresolvers.reverse 来反向解析名称
  • 一个相对的或相对的U奇骏L,将维持原状的作为重定向的岗位。

默许再次来到2个有时的重定向;传递permanent=True 能够回去三个恒久的重定向。

示例:

你能够用八种办法利用redirect() 函数。

U奥迪Q5Lconf的正则字符串参数

一、轻便布置

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

 注意几点:

'''
    NOTE:
1、一旦匹配成功则不再继续
2、若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
3、不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
4、每个正则表达式前面的'r' 是可选的但是建议加上。

一些请求的例子:

    /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
    /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
    /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
                       views.month_archive(request, '2005', '03')。
    '''

#设置项是否开启URL访问地址后面不为/跳转至带有/的路径
APPEND_SLASH=True

无名分组和老牌分组

地方的演示使用轻巧的、未有命名的正则表明式组(通过圆括号)来捕获U福特ExplorerL
中的值并以地方参数字传送递给视图。在越来越高档的用法中,能够动用命名的正则表达式组来捕获U帕杰罗L

中的值并以关键字 参数字传送递给视图。

在Python
正则表达式中,命名正则表明式组的语法是(?P<name>pattern),其中name 是组的称谓,pattern 是要协作的形式。

 

from app02 import views
from django.conf.urls import url

urlpatterns = [
  #无名分组
    url(r'^article/\d{4}', views.year) ,

    url(r'^article/(\d{4})$', views.year2),
    如果有多个匹配一样的时候,谁放在上面就匹配谁,上面的就会把下面的覆盖了
    正则加上括号,就是分组,会把分组的内容作为year2函数的参数传进去
    url(r'^article/(\d{4})/(\d{2})$', views.year_month),

    # 有名分组(就是给分组起个名字,这样定义的好处就是按照关键字参数去传参了,指名道姓的方式)
    url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname)
]

 

 捕获的值作为重要字参数而不是岗位参数字传送递给视图函数。比方:

/articles/2005/03/    
    请求将调用views.month_archive(request, year='2005', month='03')函数

 

在实际上利用中,那表示你的U奥迪Q叁Lconf
会尤其清楚且不易于发生参数顺序难题的荒谬 ——
你能够在您的视图函数定义中重新陈设参数的相继。当然,这个好处是以简练为代价;有个别开垦职员以为命名组语法丑陋而麻烦。

4、视图层之视图函数(views)

一个视图函数,简称视图,是二个简短的Python
函数,它接受Web请求并且重返Web响应。响应得以是一张网页的HTML内容,二个重定向,一个40四荒唐,一个XML文书档案,大概一张图片.
. . 是别的东西都能够。无论视图本人蕴涵怎么样逻辑,都要回来响应。代码写在何地也不在乎,只要它在你的Python目录下边。除却未有越来越多的渴求了——能够说“没有何样神奇的地点”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名称叫views.py的文书中。

三个大致的视图函数

—–views.py

from django.shortcuts import render,HttpResponse

# Create your views here.
def year(request):  # request参数请求所有的参数,这个参数一定要有
    return HttpResponse("ok")  #每一个视图函数必须有return
def year2(request,year):
    print(year)
    return HttpResponse("hello")   #返回的一定是一个字符串,如果你想return纯字符串,就用HttpResponse方法
def year_month(request,year,month):
    print(year,month)
    # 返回的是匹配的年和月拼接的结果
    return HttpResponse(year+month)   #
def year_month_hasname(request,month,year):
    # return HttpResponse("ok")
    print(year,month)
    return HttpResponse("month是:%s,year是:%s"%(month,year))

留意:视图会再次回到三个HttpResponse目的,在那之中带有生成的响应。每种视图函数都承担再次来到3个HttpResponse对象。

传递二个对象

将调用get_absolute_url() 方法来获得重定向的UKugaL:

1
2
3
4
5
6
from django.shortcuts import redirect
 
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)

HttpRequest对象

属性:

'''
path:       请求页面的全路径,不包括域名

method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如

               if  req.method=="GET":

                         do_something()

               elif req.method=="POST":

                         do_something_else()

GET:         包含所有HTTP GET参数的类字典对象

POST:       包含所有HTTP POST参数的类字典对象

COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。

FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
             name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

             filename:      上传文件名,用字符串表示
             content_type:   上传文件的Content Type
             content:       上传文件的原始内容


user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
             没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
             可以通过user的is_authenticated()方法来辨别用户是否登陆:
             if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
             时该属性才可用

session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

'''

方法:

get_full_path()

小心:键值对的值是七个的时候,比如checkbox类型的input标签,select标签,供给用:

request.POST.getlist("hobby")

传递1个视图的名目

能够包蕴地方参数和重大字参数;将运用reverse() 方法反向分析UEscortL: 

1
2
3
def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

render 函数

render(request, template_name[,
context])

组合一个加以的模版和二个加以的上下文字典,并重临一个渲染后的
HttpResponse 对象。

参数:
     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

     content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

     status:响应的状态码。默认为200。

五、模型层(template)

python的模板:HTML代码+模板语法

模版包含在行使时会被值替换掉的 变量,和决定模版逻辑的 标签。

def current_time(req):
    # ================================原始的视图函数
    # import datetime
    # now=datetime.datetime.now()
    # html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now


    # ================================django模板修改的视图函数
    # from django.template import Template,Context
    # now=datetime.datetime.now()
    # t=Template('<html><body>现在时刻是:<h1>{{current_date}}</h1></body></html>')
    # #t=get_template('current_datetime.html')
    # c=Context({'current_date':str(now)})
    # html=t.render(c)
    #
    # return HttpResponse(html)


    #另一种写法(推荐)
    import datetime
    now=datetime.datetime.now()
    return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})

模板语法:
指标是将变量(数据库的剧情)怎样美妙的嵌入到html页面中(就毫无以前大家用的字符串拼接了)

在 Django
模板中遍历复杂数据结构的最首借使句点字符  .

语法:

{{var_name}}   

view.py

def index(request):
    import datetime
    s="hello"
    l=[111,222,333]    # 列表
    dic={"name":"yuan","age":18}  # 字典
    date = datetime.date(1993, 5, 2)   # 日期对象

    class Person(object):
        def __init__(self,name):
            self.name=name

    person_yuan=Person("yuan")  # 自定义类对象
    person_egon=Person("egon")
    person_alex=Person("alex")

    person_list=[person_yuan,person_egon,person_alex]


    return render(request,"index.html",{"l":l,"dic":dic,"date":date,"person_list":person_list}) 

template: 

<h4>{{s}}</h4>
<h4>列表:{{ l.0 }}</h4>
<h4>列表:{{ l.2 }}</h4>
<h4>字典:{{ dic.name }}</h4>
<h4>日期:{{ date.year }}</h4>
<h4>类对象列表:{{ person_list.0.name }}</h4>

留意:句点符也能够用来引用对象的艺术(无参数方法)。

<h4>字典:{{ dic.name.upper }}</h4>

小练习:

需求:当用户输入三个UENVISIONL: 

骨干流程

1、对urls实行3个装置

威尼斯人线上娱乐 52

2、views.py

威尼斯人线上娱乐 53

三、在template里创造二个timer.html页面

威尼斯人线上娱乐 54

6、模板层基础(model)

7、模型层进级(model)

传递要重定向的二个硬编码的U路虎极光L

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

也足以是2个总体的ULANDL:

1
2
3
def my_view(request):
    ...
    return redirect('http://example.com/')

私下认可情状下,redirect() 重临四个最近重定向。以上全部的方式都摄取1个permanent 参数;即使设置为True,将再次回到3个永远的重定向:

1
2
3
4
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True)  

跳转(重定向)应用

威尼斯人线上娱乐 55

威尼斯人线上娱乐 56

-----------------------------------url.py

 url(r"login",   views.login),
 url(r"yuan_back",   views.yuan_back),

-----------------------------------views.py
def login(req):
    if req.method=="POST":
        if 1:
            # return redirect("/yuan_back/")
            name="yuanhao"

            return render(req,"my backend.html",locals())

    return render(req,"login.html",locals())


def yuan_back(req):

    name="苑昊"

    return render(req,"my backend.html",locals())

-----------------------------------login.html

<form action="/login/" method="post">
    <p>姓名<input type="text" name="username"></p>
    <p>性别<input type="text" name="sex"></p>
    <p>邮箱<input type="text" name="email"></p>
    <p><input type="submit" value="submit"></p>
</form>
-----------------------------------my backend.html
<h1>用户{{ name }}你好</h1>

威尼斯人线上娱乐 57

注意:render和redirect的区别:

一、 if
页面须求模板语言渲染,须要的将数据库的数码加载到html,那么render方法则不会显得这一某个。

二、 the most important:
url未有跳转到/yuan_back/,而是还在/login/,所以当刷新后又得重复登入。

 

威尼斯人线上娱乐 58


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图