• 小知识汇总8.29-2


    目录

    1.垃圾回收机制

    2. 实现单例模式的方式有哪些?

    3. python中的常用模块及方法

    os模块: 与操作系统交互的一个接口

    sys 模块

    json/pickle模块

    datetime模块/time模块

    re模块  正则

    random随机数模块  生成随机数

    hashlib加密模块

    logging日志模块

    multiprocessing模块

    socket 套接字模块

    4. 什么是浮动, 浮动的坏处是什么,怎么解决?

    5. 你所知道的定位有哪些,有什么特点?

    static

    relative

    absolute

    fixed

    1.简述可迭代对象,迭代器对象,生成器对象及应用场景

    2.什么是元类?元类的应用场景有哪些,能具体说说吗?

    3.你用的MySQL是哪个引擎,各个引擎之间有什么区别

    4.什么是Js,Js的数据类型有哪些,Js序列化反序列化用的是什么方法

    1.现有三个普通函数a,b,c都需要用户登陆之后才能访问。现需要你写一个装饰器校验用户是否登陆,并且用户只要登陆一次其他函数在调用时也无需再校验

    2.什么是进程,线程,协程,程序中如何依次创建/实现它们(可讲大致思路)

    3.列举你所知道的PEP8 Python编码规范

    4.快答

    1.简述数据库表设计中一对一、一对多、多对多的应用场景,char与varchar的区别

    2.有一个列表[3,4,1,2,5,6,6,5,4,3,3]请写出一个函数,找出该列表中没有重复的数的总和

    3.什么是函数的递归调用?书写递归函数需要注意什么?你能否利用递归函数打印出下面列表中每一个元素(只能打印数字),l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]

    4.谈谈你对web框架的认识,简述web框架请求流程并列举出python常见web框架

    1.使用bootstrap需要注意什么,常用的bootstrap样式有哪些?

    2.安装django需要注意的事项有哪些(最少三条及以上,越多越好)

    3.如何验证django是否安装成功,命令行如何创建django项目,如何启动django项目。与pycharm创建django项目的区别?

    4.什么是app,django中如何创建app,需要注意什么



    1.垃圾回收机制

    python的垃圾回收机制简称GC(高级语言都有自己的垃圾回收机制), python主要通过三种方式来解决垃圾回收的方式: 引用计数, 标记清除,分代回收.

    引用计数: 如果有新的引用指向对象, 对象引用计数加加一,引用被销毁时对象引用计数减一, 当用户的引用计数为0时,该内存释放. 

    标记清除: 首先标记对象(垃圾检测),然后清除垃圾(垃圾回收).        

            首先初始所有对象标记为白色, 并确定根节点对象(这些对象不会被删除),标记他们为黑色,(表示对象有效). 将有效对象引用的对象标记为灰色, (表示对象可达, 但是他们所引用的对象骄傲没有检查).检查完灰色对象引用的对象后, 将灰色标记为黑色, 重复直到不存在灰色的节点为止. 最后白色节点都是要清除的对象. 

    分代回收: 垃圾回收器会更频繁的处理新对象, 一个新的对象即是你的程序刚创建的 , 而一个老的对象则是经过了几个时间周期之后仍然存在的对象, python会在当一个对象从零代移动到一代, 或者是从一代移动到二代的过程中提升这个对象.

    2. 实现单例模式的方式有哪些?

    单例:即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间
     如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了

    方式一: 定义一个装饰器来实现单例

    1. settings.py
    2. HOST='1.1.1.1'
    3. PORT=3306
    4. # 方式一: 定义一个装饰器实现单例模式
    5. import settings
    6. def singleton(cls): # cls=Mysql
    7. __instance=cls(settings.HOST,settings.PORT)
    8. def wrapper(*args,**kwargs):
    9. if args or kwargs:
    10. obj=cls(*args,**kwargs)
    11. return obj
    12. return __instance
    13. return wrapper
    14. @singleton # Mysql = singleton(Mysql)
    15. class Mysql:
    16. def __init__(self,host,port):
    17. self.host = host
    18. self.port = port
    19. obj1=Mysql()
    20. obj2=Mysql()
    21. obj3=Mysql()
    22. print(obj1 is obj2 is obj3) # true
    23. obj4=Mysql('1.1.1.3',3307)
    24. obj5=Mysql('1.1.1.4',3308)
    25. print(obj3 is obj4) # false

    方式二: 基于类来实现单例

    1. # 方式二: 定义一个类方法实现单例模式
    2. import settings
    3. class Mysql:
    4. __instance=None
    5. def __int__(self,host,port):
    6. self.host = host
    7. self.port = port
    8. @classmethod
    9. def singleton(cls):
    10. if not cls.__instance:
    11. cls.__instance=cls(settings.HOST,settings.PORT)
    12. return cls.__instance
    13. #
    14. obj1=Mysql('1.1.1.2',3306)
    15. obj2=Mysql('1.1.1.3',3307)
    16. print(obj1 is obj2) # >>>> false
    17. obj3= Mysql.singleton()
    18. obj4= Mysql.singleton()
    19. print(obj3 is obj4) # true

    方式三: 基于元类来实现单例

    1. import settings
    2. class Mymeta(type):
    3. def __init__(self,name,bases,dic):
    4. # 定义类mysql时就触发
    5. # 实现冲配置文件中取配置来造一个mysql实例
    6. self.__instance = object.__new__(self) # 产生对象
    7. self.__init__(self.__instance,settings.HOST,settings.PORT) # 初始化对象
    8. # 上述两部可以合并为一步
    9. # self.__instance=super().__call__(*args,**kwargs)
    10. super().__init__(name,bases,dic)
    11. def __call__(self, *args, **kwargs): # mysql(...)时触发
    12. if args or kwargs: # 有值
    13. obj=object.__new__(self)
    14. self.__init__(obj,*args,*kwargs)
    15. return obj
    16. return self.__instance
    17. class Mysql(metaclass=Mymeta):
    18. def __init__(self,host,port):
    19. self.host= host
    20. self.port =port
    21. obj1=Mysql()
    22. # 没有传值则默认从配置文件中都配置来实例化, 所有的实力应该指向一个内存地址
    23. obj2=Mysql()
    24. obj3=Mysql()
    25. print(obj1 is obj2 is obj3) # True
    26. obj4=Mysql('1.1.1.4',3307)

    3. python中的常用模块及方法

    os模块: 与操作系统交互的一个接口

    os.path.join(path1[,path2[,...])将多个路径组合后返回, 第一个绝对路径之前的参数将被忽略[拼接路径].
    os.path.split()返回文件的路径和文件名
     
    os.path.splitext()将文件名和扩展名分开
    os,mkdir('dirname')    生成单极目录,相当于shell中的mkdir dirname
    os.remove()  删除一个文件
    os.listdir()    列举指定路径下的文件名称
    os.rename()  重命名文件夹
    os.getcwd() 获取当前工作路径
    os.path.exists()判断当前路径是否存在
    os.payj.isdir()判断当前路径是否是文件夹/目录
     
    os.path,isfile()判断当前文件是否是一个文件
    os.path.getsize()  获取文件大小, 单位是bytes
     
    os.chdir切换路径

    sys 模块

    sys.path   结果是一个列表
    sys.version查看解释器信息
    sys.platform 查看当前平套信息

    json/pickle模块

    序列化模块. 是不同编程语言之间数据交互必备的模块,属于字符串,可以调用encode方法将字符串转换成二进制数据, 明显的特征是双引号.json只能序列化最基本的数据类型, picklemok 可以序列化所有的数据类型,包括时间, 函数,类等.

    pickle模块没有数据类型的限制, 可以将任意数据类型都转化成序列化格式, 但是仅限于python内部使用.

    json.dump(s)()   将其他数据类型转换成json格式字符串
    json.load(s)() 将json格式字符串转换成对应的数据类型
    pickle.dump(s)()   
    pickle.load(s)()

    datetime模块/time模块

            都是操作时间的相关模块

    time

    time.time()   时间戳
    time.sleep() 程序沉睡时间
    time.strftime() 格式化时间
    time.localtime() 当地时间

     datetime

    datetime.now() 当前时间
    datetime.utctime 格林尼治时间

    re模块  正则

    \w  匹配数字字母下划线
    \W匹配非数字字母下划线
    \d匹配数字
    \D  匹配非数字
    ^匹配字符串的开头
    $匹配字符串的结尾
    a|b匹配字符a或者b
    ()      给正则表达式分组
    []匹配字符组中的字符
    [^]匹配除了字符组中字符的所有字符
    *尽可能多的匹配,0+次
     
    +重复匹配1+次
     
    ?默认匹配一次
    [n]  重复n次
    {n,}重复n+次
    n,m}重复n~m次

    random随机数模块  生成随机数

    random.random() 0-1之间的小数
    random.randint(1,9) 1-9之间的整数
    random.choice()   随机抽取一个
    random.sample() 随机抽样,自定义抽取个数
    random.shuffle()   随机打乱次序[洗牌]

    hashlib加密模块

    hashlib.md5()md5加密
    md5.update(b'xx') 加盐, 必须是二进制数据类型
    md5.hedigest() 获取加后的结果

    openpyxl模块>>> 操作excel表格, 底层用的pandas

    subprocess模块>> 模拟计算机cmd命令窗口

    logging日志模块

    记录日志 

            logging.debug(调试debug0

            logging.info(消息info)

            logging.warning(警告warn)

            logging.error(错误error)

            logging.critical(严重critical)

    multiprocessing模块

    from multiprocess import process  创建进程时引用的模块 , 在windows中类似于导入模块

    if __name__ == '__main__':启动脚本

    from mulitiprocessing import Queue                   队列

    from multiprocess import current_process/from threading  import current_thread                 查看当前进/线程号

    from threading  import thread                  创建线程, 类似于进程

    from multiprocess import lock                  进/线程锁

    from threading import event                     event  事件

    from concurrent.future import ProcessPoolExecutor,ThreadPoolExecutor                   进/线程池

    猴子补丁

    from gevent import monkey ;monkey.path_all()  用于检测所有的io操作

    socket 套接字模块

            实现客户端与服务端交互

    socket.socket()   基于网络的TCP套接字
    server.bind(('127.0.0.1',8080)) 本地回环地址链接
    server.listen() 半连接池
    sock.send(b'xx')    超客户端发送数据
    sock.recv(1024) 接受客户端发送的数据
    sock.close()   断链接
    server.close()关机
    client.connect(('127.0.0.1',8080)) 链接服务端

    struct 模块

    struct.pack 打包数据到固定长度
    struct.unpack()   将打包后的固定长度数据拆包

    4. 什么是浮动, 浮动的坏处是什么,怎么解决?

    在css中,任何元素都可以浮动, 浮动会生成一个块级框, 而不论它本身时何种元素

    浮动有两个特点:

    1.浮动的边框可以向左或者向右移动, 直到他的外边缘碰到包含边框或者另一个浮动框的边框为止.

    2. 由于浮动框不在文档的普通流中, 所有文档的普通六中的块框表现得就像浮动框不存在一样. 

    它有三中取值; left, right,none

    clear 属性规定元素的那一边不允许出现其他浮动元素. clear属性只会对自身起作用, 不会影响其他元素. 

    描述
    left在左侧不允许浮动元素。
    right在右侧不允许浮动元素。
    both在左右两侧均不允许浮动元素。
    none默认值。允许浮动元素出现在两侧。
    inherit规定应该从父元素继承 clear 属性的值。

    浮动的副作用是父标签的塌陷问题

    清除浮动主要有三种方式

    1.固定高度

    2.伪元素清除

    3.overflow:hidden

    伪元素清除法(使用较多):

    1. .clearfix:after {
    2. content: "";
    3. display: block;
    4. clear: both;
    5. }

    overflow溢出属性

    描述
    visible默认值。内容不会被修剪,会呈现在元素框之外。
    hidden内容会被修剪,并且其余内容是不可见的。
    scroll内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
    auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
    inherit规定应该从父元素继承 overflow 属性的值。
    • overflow(水平和垂直均设置)
    • overflow-x(设置水平方向)
    • overflow-y(设置垂直方向)

    圆形头像:

    1. .header-img {
    2. width: 150px;
    3. height: 150px;
    4. border: 3px solid white;
    5. border-radius: 50%;
    6. overflow: hidden;

    5. 你所知道的定位有哪些,有什么特点?

    static

    static默认值,无定位,不能当作绝对定位的参照物, 并且设置left, right值等是不起作用的

    relative

    相对定位, 相对于该元素在文档流中的原始位置,即以自己为参照物.但是即便是设置了相对定位u=的偏移值, 原来的位置还被元素占着.

    注意:position:relative的一个主要用法:方便绝对定位元素找到参照物。而其层叠通过z-index属性定义。

    absolute

    绝对定位: 设置为绝对定位的元素框从文档流完全删除, 并相对于最近的已定位祖先元素定位,元素原来在正常文档流中所占的空间会关闭, 好像该元素原来不存在一样.

    另外,对象脱离正常文档流,使用top,right,bottom,left等属性进行绝对定位。而其层叠通过z-index属性定义。

    fixed
     

    fixed:对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性 定义。

    在理论上,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。

    绝对定位和固定定位脱离文档流.相对定位不脱离文档流

    z-index

    可通过z-index设置对象的层叠顺序, z-index值大的压着小的, 只有定位了的元素才能有z-index, 也就是说浮动元素不能使用z-index, 默认的zz-index值为0, 如果没有值或者值相同,那么谁写在HTML后边谁就在上方压着对方. 定位了的元素永远压着没有定位的元素.  opacity 用来定义透明度, 取值范围0-1.

    ---------------------------------------------------------------------------------------------------------------------------------

    1.简述可迭代对象,迭代器对象,生成器对象及应用场景

     含有__iter__内置方法的对象就是可以迭代对象. 字符串,元组,列表,集合,字典,文件都是可迭代对象. 
    迭代器对象是含有__iter__和__next__方法. 迭代器对象能够极大的节省存储空间,调用__next__方法取值, 取完值就会报错. 提供了一种不依赖索引取值的取值方式. 

    生成器对象就是自定义的可迭代对象, 也含有__iter__和__next__方法, 
    当函数体代码里含有yield关键字时,第一次调用函数不会执行函数体代码, 而是将函数变成了生成器, 可以通过__next__执行函数体代码,若函数体包含多个yield关键字, 执行一次__next__返回后面的值且让代码停留在yield位置, 再次执行__next__才会基于上一次的位置往后取值到下一个yield关键字位置. 


    2.什么是元类?元类的应用场景有哪些,能具体说说吗?

     元类是所有类的父类. type.

    产生类的两种方式: class关键字/ type(类名,类的父类,类的名称空间).
    只有继承了type类的类才能当元类, 如果要切换产生类的元类, 必须使用关键字metaclass声明.

    类中的__init__方法是用来初始化对象的,元类中的__init__是用来初始化类的, 所以元类可以限制类的产生. 
    元类也可以控制对象的产生. 实例化对象时必须传入关键字参数, 对象加括号调用类中的__call__发明回复, 类加括号会调用产生类的类中的__call__方法.
    所以要高度定制对象的产生过程,可以操作元类中的__call__. 要高度定制的产生过程,可以操作元类中的__init__.
     

    3.你用的MySQL是哪个引擎,各个引擎之间有什么区别

    MySQL默认搜索引擎在5.7版本之前是myisam, 之后是innodb, 
    myisam 每张表被存放在三个文件中, 表定义文件, 数据文件和索引文件, 因为数据和索引是分开存储的 索引的叶子节点存储的数据地址需要在寻址一次才能获得数据库, 底层原理时B+树,堆表, 支持全文索引, 是表记锁定. 适用于管理非事务表,如博客系统,新闻网站等, 它提供了高速的存储和检索能力,以及全文搜索能力. 

    innodb 支持事务(acid四大特性),且支持行锁和外键约束, 设计的目标就是处理大数据容量的数据库系统. 每张表都存在同一个文件中, 索引查询时做到覆盖索引就会非常高效,利用聚簇索引的方式进行索引, 底层利用的是B+树索引,索引组织表,有行级锁,锁的粒度很小, 并发能力很强. 用于更新操作频繁或者需要保证数据的完整性,并发量高,支持事务和外键的场景, 如自动化办公. 


    blackhole 黑洞, 数据一存进去就丢失
    memory MySQL服务器把memory数据表的数据和索引都放在内存中而不是硬盘上, , 所以响应速度很快, 但是当MySQL守护进程崩溃的时候数据会丢失.它支持hash 和B+树索引.默认哈希索引(速度比B+树快), 比myisam快一个数量级. 其数据文件于索引文件是分开储存的. 数据文件存于内存, 有利于数据的快速处理. 


    4.什么是Js,Js的数据类型有哪些,Js序列化反序列化用的是什么方法

     js 是javascript 是一款轻量级的脚本编程语言, 主要用于前端, 
    js数据类型:

    基本数据类型: number, string, ,null  , undefined, boolean,symbol(es6), 这些类型可以直接操作保存在变量中的实际值.

    引用数据类型: object , 在js中处理基本数据类型之外的都是对象, 数据, 函数, 正则表达式等都是对象. 
    js 序列化,反序列化的方法:
    JSON.parse 将json格式字符串转换成对象
    JSON.stringfy  将对象转换成json格式

    ---------------------------------------------------------------------------------------------------------------------------------

    1.现有三个普通函数a,b,c都需要用户登陆之后才能访问。现需要你写一个装饰器校验用户是否登陆,并且用户只要登陆一次其他函数在调用时也无需再校验

    1. def outer(func):
    2. def inner(*args,**kwargs):
    3. res=func(*args,**kwargs)
    4. return res
    5. return inner
    6. @outer()
    7. def a():
    8. pass
    9. @outer()
    10. def b():
    11. pass
    12. @outer()
    13. def c():
    14. pass

    2.什么是进程,线程,协程,程序中如何依次创建/实现它们(可讲大致思路)

    进程: 正在被运行的程序, 多个进行同时运行需要有多个CPU,进程有三个状态: 就绪态, 阻塞态,运行态. 就绪态是所有程序被允许时都要经历的状态,运行态过程中如果出现了io操作就会进入阻塞态, 阻塞态想要进入运行态就必须经过就绪态. 
    进程还有同步异步,阻塞非阻塞之分, 其中异步非阻塞的运行效率, CPU利用率最高. 

    创建进程有两种方式. 一个是双击桌面图标,另一个是通过代码创建. 
    定义一个进程类, 类中有run方法, 在启动脚本中通过start方法创建进程.
    创建线程的方式于创建进程的方式一致.
    同一进程下的线程之间数据资源共享.
    进程还有个join方法, join主进程, 等待子进程运行结束之后在运行, 现成的join方法是主线程等到子线程运行结束之后在运行.
    进程之间默认数据,互不干扰. 守护进程是伴随着守护对象的存活而存活,死亡而死亡, 守护线程伴随着被守护的线程的结束而结束. 


    线程是进程下的'小帮手'. 进程是资源单位, 而线程才是真正干活的人. 一个线程必定有一个进程, 而一个进程可以没有线程. 

    协程是程序员们开发出来的线程'小帮手', 目的是为了达到单线程下的并发[线程是为了达到一个进程下的高并发] 它是一种用户态的轻量级线程.  再计算机层面并没有这个概念.  单线程内开启协程, 一旦遇到io就会从应用程序级别控制切换, 以此来提高效率.  

    对比操作系统控制线程的切换 , 用户在单线程内控制协程的切换, 有点是协程的切换开销更小,操作系统完全感知不到, 而且可以再单线程内就实现并发效果, 可以最大限度的利用cpu;  但是协程的本质是再单线程下,无法利用多核, 而且因为协程指的是单线程, 因而一旦写成出现阻塞,将会阻塞整个线程. 

    各种进/线/协程的主要目的就是为了提高cpu的利用率, 主要用到的计数是多道技术的切换+保存状态. 


    3.列举你所知道的PEP8 Python编码规范
     

    1. 命名方式: 变量名要见名知意, 不要使用关键字(as, print,list...)作为变量名. 

                       变量名全小写, 字母之间用_分割, 常量默认全大写. 类名使用驼峰体命名,                   

    2. 变量名由数字字母下划线组成, 但数字不能放在开头(yietong_liu)

    3. 逗号,冒号,分号之前避免空格 , 括号里边避免空格 ,索引前后(个人建议)避免空格.

          运算符前后放置一个空格

    • 涉及 =、符合操作符 ( += , -=等)、比较( == , < , > , != , <> , <= , >= , in , not in , is , is not )、布尔( and , or , not )。
    • 优先级高的运算符或操作符的前后不建议有空格。

        


    4.注释,  #+空格,  快捷键: ctrl+?

                  单行注释:若在行首, 按照此法, 若在行尾,空两格之后在执行此法.  

                  多行注释要用'','',''',""".  多引号的主要目的是为了方便引用别人的内容. 

    5.使用4个空格缩进[尽量不要使用tab键],见冒号就缩进.


    6.函数调用的左括号之前不能有空格, 关键字参数和默认值参数的前后不要加空格


    7. 尽管有时可以在if/for/while 的同一行跟一小段代码,但绝不要跟多个子句,并尽量避免换行。
     

    4.快答

        v1 = 1 or 3                            1
        v2 = 1 and 3                         3
        v3 = 0 and 2 and 1               0
        v4 = 0 and 2 or 1                  1
        v5 = 0 and 2 or 1 or 4           1
        v6 = 0 or Flase and 1           0

    ---------------------------------------------------------------------------------------------------------------------------------

    1.简述数据库表设计中一对一、一对多、多对多的应用场景,char与varchar的区别

    一对一        作者对详情
    一对多,        一个部门对应多名员工
    多对多,        书籍对应作者
    char             定长类型, 最大长度255,比较简短的信息, 如门牌号等使用.
    varchar       不定型 最大6875长度65535  不确定长度的信息, 如名字等.


    2.有一个列表[3,4,1,2,5,6,6,5,4,3,3]请写出一个函数,找出该列表中没有重复的数的总和

    1. l = [3,4,1,2,5,6,6,5,4,3,3]
    2. print(sum(set(l))) # 21


    3.什么是函数的递归调用?书写递归函数需要注意什么?你能否利用递归函数打印出下面列表中每一个元素(只能打印数字),l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]

    递归函数: : 函数在运行过程中 直接或间接地调用了自身. pycharm最大递归深度为1000[实际为997/998] 可以通过更改递归深度,

    1. import sys
    2. print(sys.setrecursionlimit(2000))

              注意: 要有明确的结束条件, 每一次递归都要比之前简单. 

    1. l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
    2. def get_num(l1):
    3. for i in l1:
    4. if isinstance(i,int):
    5. print(i)
    6. else:
    7. get_num(i)
    8. get_num(l)


    4.谈谈你对web框架的认识,简述web框架请求流程并列举出python常见web框架

    所有的web应用本质上就是一个socket服务端, 而用户的浏览器是一个客户端,

    客户端发送HTTP请求到服务器程序.>>>>服务器程序接受http报文,进行解析,转换成wsgi协议交给框架程序,>>>>框架程序进行各种处理,通过wsgi协议返回给服务器程序, >>>>服务器程序构造http响应报文,返回给客户端>>>>客户端接收相应展示页面. 

     python主流web框架: django, flask, tornado,fastapi,sanic....

    django         大而全,自身携带的功能很多,但是开发小项目的话这个框架就显得笨重了

    flask             小而精,自身功能很少, 主要依赖第三方模块,容易受第三方模块影响. 

    tornado        异步非阻塞框架, 可以充当游戏的服务器,但是上手难度很高

    ------------------------------------------------------------------------------------------------------------------------------

    1.使用bootstrap需要注意什么,常用的bootstrap样式有哪些?

    使用Bootstrap前要在head内部引用bootstrap文件: JavaScript, CSS, JQuery. 可以是本地导入[提前下载到本地, 好处是不受网络因素限制, 再无网络的情况下也可以使用]也可以是依靠网络CDN服务. 

    常用的bootstrap样式有: 背景属性background-color/img, 样式布局div,行row, 列clom, 表格table, 文本textarea ,字体fontsize等


    2.安装django需要注意的事项有哪些(最少三条及以上,越多越好)

    1. 电脑和所有的py文件中不能包含中文. 

    2. 一个pycharm窗口只运行有一个项目,不要做项目嵌套.

    3.django不同版本之间的区别不是很大, 不要纠结版本问题.

    4.不同版本的python解释器配合不同版本的django 因为版本不适配原因会出现一些报错 ,仔细找一下修改即可.

    3.如何验证django是否安装成功,命令行如何创建django项目,如何启动django项目。与pycharm创建django项目的区别?

    验证django安装成功>>>> cmd终端输入 django-admin

    1.命令行创建django项目>>> django-admin startproject 项目名

    2. 启动django项目>>>  线切换到项目目录下 cd 项目名,,, 在执行启动目录  python38 manage.py runserver ip:port   (127.0.0.1:8080)

    3. 访问django终端>>> 浏览器直接访问

    4. 创建app应用>>> python38 manage.py startapp 应用名

    pycharm创建django只需要鼠标操作即可.

    1. pycharm 创建的django项目会自动创建templates文件夹, 而终端命令行不会自动创建

    2. 命令行不会在配置文件编写关于templates文件夹的配置

            'DIRS':[os.path.join(BASE_DIR,'templates')]

    3.pycharm自动创建的第一个应用会自动注册到配置文件中

    4. 针对db.sqlit3文件不用去在乎他有没有被创建, 只要运行了django它就会自动出来.

    4.什么是app,django中如何创建app,需要注意什么
     

    django中已经创建了project,还需要创建app, 简单来说, project是配置代码, app是功能代码, 一个projrct可以包含很多个app的配置

    创建app 有三种方式, 前两个是终端方式,第三个是app方式

    1. 通过命令行, 进入到项目目录下, cmd打开命令行, 在cmd运行 python manage.py startapp Testmodel(Testmodel 是项目名)

    2. 通过pycharm , 在pycharm的terminal输入 python manage.py startapp Testmodel

    3. pycharm创建django项目时, 在最下方Moresettings里,设置appname

  • 相关阅读:
    windows局域网共享文件
    和想象中完全不一样?巡课在线就能进行
    Python学习----函数
    【Linux系统编程】进程控制
    ~2 ccf 2022-03-1 未初始化警告
    Docker Compose使用教程
    集合{Collection集合 迭代器 ArrayList集合 LinkedList集合 HashMap集合 }(一)
    广州市车联网车联网先导区 V2X 云控基础平台技术规范
    Python3 OS 文件/目录方法
    Jmeter常用参数化技巧总结
  • 原文地址:https://blog.csdn.net/weixin_67531112/article/details/126577524