-
简介
-
Django是用python语言写的开源web开发框架,并遵循MVC设计.
-
特点
-
1.重量级框架 2.MVT模式
-
环境安装
-
创建虚拟环境 mkvirtualenv 虚拟环境名称 -p python3 (-p 指向python3) 删除虚拟环境 rmvirtualenv 虚拟环境名称 查看本地虚拟环境 workon 切换虚拟环境 workon 虚拟环境的名字 退出虚拟环境 deactivate 查看所安装的包 pip list 需要装的依赖包 pip install django-redis pip install jinja2 pip install pymysql pip install pillow
-
Django创建工程 项目
-
创建Django项目要进入虚拟环境才可以 切换到虚拟环境 workon 虚拟环境名称 查看一下当前虚拟环境所安装的依赖包 pip list 创建一个工程 django-admin startproject 工程名字 进入到该工程 cd 工程名字 测试是否创建成功 --启动服务 python manage.py runserver 注意: 端口默认 8000//或者指定python manage.py runserver ip:端口 进入谷歌输入 http://127.0.0.1:8000 如果出现it worked! 恭喜你 第一步成功了 注意如果出现以下情况: **Error: That port is already in use. ** 原因: 端口没有及时关闭 端口占用 两种解决办法: 1.指定其他端口python manage.py runserver ip:端口 2.netstat -tunlp|grep 8000(端口)先根据端口查看pid kill -9 pid 杀死该进程 就会将当前端口释放 开启redis-server报错 # Creating Server TCP listening socket *:6379: bind: Address already in use --解决方法 找到redis-server 的进程 ps -ef | grep -i redis 杀死该进程 kill -9 3086
-
Django创建子应用
-
1.首先确认是否在虚拟环境前会有虚拟环境的名称 然后进入到创建的工程里面 cd 工程目录 2.创建子应用: python manage.py startapp 子应用名称 3.用pycharm打开该项目 *配置pycharm的虚拟环境: 先进入终端--进入虚拟环境--进入该项目 which python3 查看路径 然后将出现的路径粘贴到 file--settings--project--interpreter--下拉菜单右侧齿轮点击--add local的弹框 切记: 一定要选择虚拟环境对应的python3 选择的完点击ok 检查一下是否存在Django-1.11.11版本 然后测试 点击pycharm的左下角有个Terminal(pycharm中的终端) 输入 python manage.py runserver 打开谷歌 访问 http://127.0.0.1:8000 即虚拟pycharm虚拟环境配置成功 4.注册app{settings.py}(由于自己写的子应用,运行的时候需要告诉Django--所以要注册) 在配置文件settings.py -> INSTALLED_APPS->'user-apps-AuserConfig' (创建子应用名称---里面的apps(一成不变的)----apps里面定义的类名)!!相对路径即可 例如 user---自己创建的子应用名称 apps--创建子应用时自带的一个py文件 AuserConfig apps里面定义的类名(会自动提示,注意要选择和自己创建应用名字对应的) ***养成习惯 因为配置文件里的信息要用逗号分隔,为了防止不必要的麻烦,每注册一个app就在后面要加一个逗号 5.配置路由(urls.py) urlpatterns = [ #系统自带的路由 不要动 url(r'^admin/', admin.site.urls),] # 路由 ->视图函数 # url(r'^aa/', views.ceshi), 第一个参数写自己的功能, 以什么开头 都可以 [创建视图函数过程--- view.py] 第二个参数是 视图函数(路由要找视图函数) 由于视图函数(views.py)和urels.py 不在同一级所以需要导包 视图函数(views.py) 中定义函数 该函数的作用: 接收请求对象 def 函数名(request): (处理业务逻辑) [[[[[[[[[[[[[[[[暂时不涉及 后期补充]]]]]]]]]]]]]]]] from djang.http.response imporet HttpRequest 返回响应对象 return HttpRequest('要返回的对象') 记得导这个包 以Django开头] **综上所述 第二个参数 自定义的子应用名.views.里面定义的函数名(views.里面定义的函数名) 两种都可 只不过导包模式不一致 启动验证一下: python manage.py runserver 访问返回响应对象的值 全路由是 http://127.0.0.1:8000/aa (aa是第一个参数设置的.写啥跟啥) 注意: 如果出现404 错误 99%是路由写错了!!! 总路由--子路由---视图函数 同名子目录--urls.py ->url(r'user/',include('子应用名称.urls')) 子应用目录--创建urls.py->url(r'user/',include('views.功能名称')) 子应用目录--views.py---定义函数 url(r'^aa/',include('子应用名称.urls')),//子路由是在新建的子应用中新建一个urls.py的文件 !!主路由前面可以省略 aa url(r'^',include('子应用名称.urls')) include中的字符串的意思是该子应用名称下的子路由 子应用名称.urls中 urlpatterns = [ # 子路由----视图函数 url(r'^login/$', views.index),] 由于该路由和views是统计关系 所以导包的时候 from . import views 现在访问的全路由 http://127.0.0.1:8000/aa/login aa 为主路由 login为子路由 6.配置文件 import os //IO 操作用 读写用 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) //项目的绝对路径 用来做路径拼接 注意 : 在项目中自己新创建一个文件夹 不会自动加载 Django自己带的可以自动加载 所以需要对新创建的文件夹需要 将其路径拼接完全 然后就告诉项目要用该文件夹 拼接路径用到的函数 os.path.join(BASE_DIR,文件夹的名字) __file__ 当前文件 指的是settings.py abspath 绝对路径 os.path.abspath(__file__) 当前settings.py的绝对路径 os.path.dirname -> ../ os.path.dirname(os.path.abspath(__file__))当前settings.py的绝对路径../ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))当前settings.py的绝对路径../../(也就是项目目录下) [加密:] SECRET_KEY = '0z65$&qdo72ta0v3j=+rnc4rkhmbd79@8-3kv=5bg-45!67du!' [DEBUG模式(生产模式的时候要改成False)] DEBUG = True ALLOWED_HOSTS = [] DEBUG = False ALLOWED_HOSTS = ['127.0.0.1'] **注意 : 如果为False模式 需要在 ALLOWED_HOSTS中设置域名 该模式不会提示错误 [INSTALLED_APPS] 注册app [MIDDLEWARE] 中间件的设置 [ROOT_URLCONF = 'logintest.urls'] 总路由路径 [TEMPLATES] 模板配置 [WSGI_APPLICATION] WSGI协议 [DATABASES] 数据库 LANGUAGE_CODE = 'zh-hans' 中文 TIME_ZONE = 'Asia/Shanghai' 时区 差8个小时 默认0时区 东八区 上海 STATIC_URL = '/static/' 7.静态文件 1.静态文件路由 2.创建文件夹(无论上传下载都放在该文件夹中) 创建完要配置静态文件夹路径 STATICFILES_DIRS=[os.path.join(BASE_DIR,文件夹的名字)] 启动服务测试 http://127.0.0.1:8000/static/2.png 8.路由屏蔽 1.路由列表从上到下 2.正则匹配问题默认匹配一个就结束了 有开头^ 有结尾$ 结尾一定不要加错,要加在子路由上,加载总路由就会报404 废了 路由屏蔽的原因:路由列表默认从上往下加载,而正在正则匹配的时候如果上面的路由匹配成功了 就不会在继续往下匹配了,路由的不规范写法导致,路由被屏蔽了 解决方法: 严格按照路由书写规范书写,有开头有结尾符号 """***注意*** * url(r'^admin/$', views.urls), 路由中admin后面有/ 如果在前端请求时么有加/ 从正则的角度是不能匹配成功的 从用户的角度是可以匹配成功的,实质没有成功 只是进行了重定向 没有找到带/的路由 后台默认重定向给补上/所以在用户角度成功 后面加/会给用户带来方便 至于加不加 看公司需求 /代表文件夹 url代表文件资源 加/违反了url 标准规范写法 [Django中定义路由时,通常以斜线/结尾, 其好处是用户访问不以斜线/结尾的相同路径时, Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在。 如用户访问 index 或者 index/ 网址,均能访问到index视图 虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。是否结尾带/以所属公司定义风格为准。]""""" 9.路由的反向解析 使用场景是重定向 a.路由的正向解析:settings.py ---root_url='zdemo.urls'--urls.py --总路由--子路由--视图函数 指向项目的总路由文件 b.路由的反向解析:视图函数---子路由---总路由 () 作用: 用于重定向(redirect('路由')) 本来去A的 去B了就是重定向 redirect('/user/login/') 手写路由 易出错低级错误 ,不易扩展 reverse 倒置 redirect(reverse()) 出错少,易扩展 3步骤 1.给总路由添加名字 namesapce 2.给子路由添加名字 name 3.reverse('namespace:name') 求出来路由是多少 总路由添加名字: namespace 写在总路由的include里面,写错了不报错 一定要注意不要放在include 外面 url(r'^cs/', include('ceshi.urls',namespace='center')) 子路由添加名字: url(r'^center/', views.login,name='child') 在视图函数中 : url_path = reverse('center(总路由名字):child(子路由名字)')----导Django的reverse包 重定向 redirect(reverse('users:login1')) redirect(reverse('总路由名称:子路由名称'))
初来乍到,如有不对的地方,还请多多见谅----gongzy