Django命令

Python40

Django命令

原创

wx5e6caa8b9792d博主文章分类:Python自动化开发 ©著作权

文章标签 python django 文章分类 Python 后端开发

©著作权归作者所有:来自51CTO博客作者wx5e6caa8b9792d的原创作品,请联系作者获取转载授权,否则将追究法律责任

1创建projectdjango-admin startproject myprojectcd mysitepython manage.py startapp app01
  • 收藏
  • 评论
  • *举报

上一篇:validate自定义配置2

下一篇:validate自定义项目配置

Original: https://blog.51cto.com/u_14754853/5533507
Author: wx5e6caa8b9792d
Title: Django命令



相关阅读1

Title: Python 为什么不设计 do-while 循环结构?

在某些编程语言中,例如 C/C++、C#、PHP、Java、JavaScript 等等,do-while 是一种基本的循环结构。

它的核心语义是:先执行一遍 循环体代码,然后执行一遍 条件语句,若条件语句判断为真,则继续执行循环体代码,并再次执行条件语句;直到条件语句判断为假,则跳出循环结构。

流程图如下(Java 示例):

Django命令

// 打印小于 20 的数字
public class Test {
   public static void main(String[] args){
      int x = 10;
      do {
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      } while(x < 20);
   }
}

Python 并不支持 do-while 结构,"do"并不是一个有效的关键字。

那么,为什么 Python 不提供这种语法结构呢,这种现状的背后有何种设计考量因素呢?

在回答这个问题之前,让我们再仔细思考一下 do-while 语法可以解决什么问题,看看使用这种结构能带来什么好处?

最显而易见的好处是:do-while 语法保证了会先执行一遍循环体代码。

它的使用场景也许不多,但是,跟普通的 while 循环或者 for 循环语法的" 条件前置"思想不同,它体现的是一种" 条件后置"的编程逻辑,也是一种控制循环的常见方式。

它们的关系似乎有点像 C/C++ 这些语言中的 i++++i操作的区别,在某些特殊场合中,也许会更为高效。

除了这一特点,这种结构最大的应用场景其实是在 C/C++ 中特殊的 do {...} while (0) 用法。这在很多开源项目的源码中都能找到踪迹,例如 Linux、Redis 以及 CPython 解释器,等等。

这里面的数字 0 表示布尔值 False,意味着循环只会执行一遍,然后就跳出。

这样的写法是不是很诡异?所谓"循环",一般就意味着程序体会被反复执行多次,但是, do {...} while (0) 却偏偏只需要它执行一遍,这初看起来是有点多余啊。

这种写法主要用在宏函数的定义中,可以解决宏代码块的编译问题,使代码按照我们的意图而合理分块。

另外, do {...} while (0) 结合 break 使用,还可以实现很优雅的跳转控制效果。

在下面的示例中,步骤 1、4 和 5 要求必须执行,而步骤 2 取决于步骤 1 的执行结果,步骤 3 则取决于步骤 2 的执行结果。

do {
  // 执行步骤 1
  if (条件1失败) {
    break;
  }
  // 执行步骤 2
  if (条件2失败) {
    break;
  }
  // 执行步骤 3
  if (条件3失败) {
    break;
  }
} while(0);
// 执行步骤 4
// 执行步骤 5

在这种场景中,我们确实只需要按照顺序执行一遍。do-while 结构很清晰,避免造成多层条件嵌套或者设置诸多额外标记的局面。

最后还有一点,在汇编层面,do-while 比 while 更接近汇编语言的逻辑,可以节省使用指令,在过去的低内存时代,算得上是一种优化写法。

分析完 do-while 的好处后,让我们回到主题:Python 为什么不需要设计 do-while 循环语法呢?

首先,Python 离底层应用编程太远了,就不用考虑汇编指令的优化了,同时,它也不涉及宏的使用。

至于"条件前置"和"条件后置"的区别,其实并没有太大影响,而且,由于 Python 使用简洁优雅的缩进加冒号语法来划分代码块,导致直译过来的 do-while 语法看起来会很怪异(注意,直译的 while 的条件后没有其它内容):

do:
    pass
while False

想要引入新的语法特性,必然要遵守既定的风格习惯。其它语言的 do-while 结构直译成 Python 的话,肯定不合适。

事实上,在 2003 年时,有一个 PEP 提议给 Python 加上 do-while 语法支持:

Django命令

PEP-315 Enhanced While Loop

该 PEP 提议增加一个可选的 do 子句,支持将 while 循环扩展成这样子:

do:

while :

这不是简单地从其它语言翻译成 Python,它的 while 语句后保留了 Python 的缩进用法,并不会造成直译形式的突兀结果。

加上 while 循环本身已支持的可选的 else 子句,因此,while 完整的语法结构是这样的:

while_stmt : ["do" ":" suite]
            "while" expression ":" suite
            ["else" ":" suite]

(PS.在本系列的下一篇文章,我们将解释为什么 Python 要支持 while-else 语法)

也就是说,在保持原 while 循环语法不变的情况下,PEP-315 提议支持在 while 前面使用一个可选的 do 子句。

do 子句只会执行一遍,当它里面出现 break 时,则跳出整个 do-while 循环;当 do 子句中出现 continue 时,则跳出 do 子句,进到 while 的条件判断中。

有了 do 子句后,很容易就能实现 do {...} while (0) 的跳转控制效果。

但是,这个 PEP 遭到了一些核心开发者的反对。

反对的理由是,不需要引入新的关键字和语法,仅使用现有语法就能很好地实现同样的功能:

while True:

    if not :
        break

Python 之父 Guido van Rossum 也持反对意见,他的原话是:

Django命令

Please reject the PEP. More variations along these lines won't make the
language more elegant or easier to learn. They'd just save a few hasty
folks some typing while making others who have to read/maintain their code wonder what it means.

简单翻译一下,这种 do-while 语法并不会使 Python 更优雅好用,反而会产生阅读/维护代码的理解负担。

就个人的感觉而言,我也不赞成引入 PEP-315 那种可选的 do-while 语法,虽然它比固定形式的 do-while 结构更为灵活和优雅一点。

最后稍微总结一下,do-while 作为一种常见的循环结构,在其它语言中有所发挥,它甚至还发展出了 do {...} while (0) 的典型用法,但是,do-while 能够解决的几个问题要么在 Python 中并不存在(宏定义、汇编指令),要么就是已经有更为合适而低成本的实现(跳转控制)。

看完这篇文章,你是否还有其它补充的内容呢?欢迎交流讨论。

如果你对 Python 语言设计相关的话题感兴趣,欢迎订阅 Github 上的《Python为什么》系列文章(https://github.com/chinesehuazhou/python-whydo)

关联阅读:

Python 为什么会有个奇怪的"..."对象?

Python 函数为什么会默认返回 None?

Python 之父为什么嫌弃 lambda 匿名函数?

为什么继承 Python 内置类型会出问题?!

Python 为什么推荐蛇形命名法?

Original: https://www.cnblogs.com/pythonista/p/15815346.html
Author: 豌豆花下猫
Title: Python 为什么不设计 do-while 循环结构?

相关阅读2

Title: Python自学笔记6-列表有哪些常用操作

列表是Python中最重要的数据类型,它使用的频率非常非常的高,最大程度的发挥Python的灵活性。

和字符串一样,列表的操作方法也有很多。如果说一头钻进去,可能会导致学习没有重点。在这篇文章当中,首先九柄会跟大家介绍列表的基础操作,然后我会跟大家去说一些列表这个数据类型常用的实战操作。

争取能够对Python列表有一个大概的认识。

Python列表定义

首先我们来看一下列表的定义。列表通常用来存储多个数据,每一个数据之间用逗号隔开,他们被称为元素,列表的左右两边带有中括号。

a_list = [1, 2, 3, 4]

你可以把列表想象成是某种容器,你可以往这个容器里面塞入任何的东西。并且列表当中的元素可以是任意的数据类型,你可以在一个列表当中同时存储数字、字符串,甚至嵌套列表。

a_list = [1, "hello", ["new", "list"]]

当然,虽然列表可以存储不同的数据类型,但是大多数情况下,里面元素的数据类型是一样的,你可以简单理解他和其他的编程语言当中的数组差不多。

Python列表的基本操作

列表的基本操作分为:增、删、改、查。

  • • "查" 主要是去获取列表的某一个元素或者是多个元素,通过索引和切片可以获取。
  • • "增" 主要是对这个列表当中去添加一个新的元素。
  • • "删" 主要指我们对列表当中的某元素进行删除。
  • • "改"主要是这个对这个列表当中的元素去进行修改。

因为列表本身有多个元素,我们可以获取它的长度

a = [1, 2, 3]print(len(a)) #3

Python列表索引

列表的索引的表示基本上和字符串的表示方法差不多,所以你可以直接引用字符串当中的操作,索引从0开始

man = [1, 2, 3]print(man[1]) #2print(man[0]) #1

索引可以是负数,表示倒数第几个,也就是从列表的右边数到左边。索引为 -1 表示获取倒数第一个元素,索引为 -2 表示获取倒数第二个元素。为什么正序数的索引从 0 开始,倒序就不能从 0 开始呢?因为索引为 0 不能同时表示两个元素,会造成指令的冲突。

print(man[-1]) #3

超出索引范围报 IndexError 错误

print(man[8])

Python列表切片

列表的切片呢也基本上和字符串的切片差不多。所以我们可以直接用字符串切片的方法。切片的表示方法是:​ &#x200B;var[start: end]&#x200B;​。 start 表示开始位置的索引号,end 表示结束位置的索引号, 但是不包含 end。

girl = [1,2,3,4,5,6]part_of_girl = girl[0:1]print(part_of_girl)  # [1]

切片的索引号也可以是负数,但是在使用的时候要确保 end 是在 start 的右边,end - start > 0 。

print(girl[0: -2])  print(girl[-2: -4])

切片的索引号超出范围是不会报错的,取到尽头为止。

print(girl[0:100000000000])

切片的 start 和 end 都可以省略。

girl[1:]girl[:-1]girl[:]

切片可以加第三个参数, ​ &#x200B;girl[start:end:step]&#x200B;​, 其实使用切片时,默认的步长是为 1。

girl[0:3:2]

Python列表添加元素

列表当中添加一个新的元素,我们主要使用两种方法。

第一种方法是使用 append 方法在列表的最后面添加一个元素。

a = [1, 2]a.append(3) # [1,2,3]

第二种方法是通过 insert 方法在某个索引的位置添加一个新的元素,对比一下和上一种方法的区别。

a = [1, 2]a.insert(0, 3)# [3,1,2]

Python 列表去除重复元素

在列表当中删除元素的方式也有两种。

第1种是通过remove方法移除指定的值。

a = ["a", "b"]a.remove("a")# ['b']

第2种是通过 Pop方法,删除指定索引位置的值。

a = ["a", "b"]a.pop(1)# ['a']

如果想直接清空这个列表,那么就可以使用clear方法。

a.clear()

比较常见的是,我们经常要对列表当中的元素去重,可以通过先转化成集合类型,然后再转回列表类型。

a = [1, 2, 1, 4, 2]print(list(set(a)))

Python列表求和

有的时候呢,我们会在一个列表里面去存储很多的数据,并且要对整个列表当中所有的数据去求和,则可以使用 sum 函数

a = [1, 2, 1, 4, 2]print(sum(a))

Python 列表排序

列表排序也是使用非常非常多的操作,对整个列表排序之后,可能会简化之后的操作。 要实现排序,不一定非得实现排序算法,在Python当中,可以直接调用列表下面的sort 方法实现排序。

a = [1, 5, 3, 2]a.sort()

如果想从大到小排序呢,我们可以再加上一个reverse参数。

a.sort(reverse=True)

Python列表推导式

列表推导式是我建议每一个Python初学者都掌握的一个进阶技巧。它能够极大的简化一些列表的复杂操作,让我代码变得更加的优雅。列表推导式主要应用的场合,是对列表当中的每一个元素去进行同样的操作,比如说我们想对一个列表当中的每一个元素都转化成字符串,那么就非常适合使用列表推导式来操作。

a = [1, 5, 3, 2]b = [str(i) for i in a]# b = ['1', '5', '3', '2']

总结

列表经常出现在初级Python程序员的面试题当中。如果你刚开始学Python,想找一份Python相关的工作,那么在面试过程当中一般都会问到一些关于列表的面试题。

Django命令

image.png

其中一个原因是列表确实用的频率比较高,第2个原因是列表一种可变的数据类型,当对它去进行操作时候,比较容易出现bug,在面试当中,如果说对列表进行考核的话,能够稍微看出一个人的代码功底。

Original: https://blog.51cto.com/u_12188579/5621066
Author: 九柄聊测试
Title: Python自学笔记6-列表有哪些常用操作

相关阅读3

Title: Django+uwsgi+vue部署(不使用nginx)

背景

  • 项目在内网部署,本来想使用nginx部署,因为某些原因,所以采用了Django+uwsgi+vue部署的部署方式

部署流程

Vue打包

  • 不熟悉VUE,按照给的步骤进行

  • 执行 npm run lint-fix

  • 执行 npm run build
  • 将生成的包放到Django项目根目录的static目录下

Django配置

静态文件目录

-- project/
    .....

    manage.py
    -- static/
        ....

        dist/
        index.html
    .....

setting.py配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'static/')],  # 新增,vue打包生成的index的此目录下
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

STATIC_SAN = os.path.join(BASE_DIR, 'static/dist')

路由配置urls.py

urlpatterns = [

    path(r'', TemplateView.as_view(template_name='index.html')),
    # 静态文件, 此配置是使用runserver,开发时的配置.生产时不需要(?会被uwsgi的路由覆盖)
    # 因为VUE引用的静态文件是此路由,所以这样配置.也可按照注释的配置进行
    url(r'^dist/(?P.*)$', static.serve, {'document_root': settings.STATIC_SAN}, name='static'),
    # url(r'^static/(?P.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static'),
]

# 覆盖原有404
handler404 = page_not_found

重写handler404

from django.http import HttpResponseNotFound
from django.shortcuts import render

def page_not_found(request, exception):
    return HttpResponseNotFound(render(request, 'index.html'))

uwsgi配置和说明 pro.ini

[uwsgi]
#项目目录
chdir=/usr/local/pro/
#项目启动模块
;module=pro/pro.wsgi
wsgi-file = pro/wsgi.py
master=True
home = /usr/local/python/python38
# 测试时配置与否不影响运行
PYTHONHOME = /usr/local/python/python38/bin
;进程id存放文件
pidfile=/run/pro/pro.pid
vacuum=True
;最大请求数为10000设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏
max-requests=10000
;日志文件目录,设置了此项可以让程序后台运行
daemonize=/tmp/pro/pro.log
;监听9100端口,注意这里不是socket,当时困恼了几天
http=:8021
;stats=:9001
;防止部分文件名特殊字符乱码
env = LANG=en_US.UTF-8
processes=2
threads=4
# 启用线程支持
enable-threads = true
# 在master而不是每个worker中加载应用
lazy-apps = false
# 向外提供静态文件,'/static'代表路由,第二个static代表项目静态文件目录,此项可配置多个
# 因为与django配置的路由相同,请求先到达uwsgi服务器,所以不会执行django的路由
static-map = /nis-console=static/nis-console
# 日志切分 50MB,切分的会文件名为daemonize + 时间戳
log-maxsize = 50000000
# 默认打开
;log-truncate = true

运行uwsgi

uwsgi --ini /usr/local/pro/pro/pro.ini

停止运行

ps -ef |grep uwsgi|grep -v grep|awk '{print $2}'|xargs kill -9

Original: https://www.cnblogs.com/tastepy/p/15823573.html
Author: TasteL
Title: Django+uwsgi+vue部署(不使用nginx)