首页 > 代码库 > python 全栈 web框架 Django进阶

python 全栈 web框架 Django进阶

django 进阶
	
  基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架!
  实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制。既然基础已经了解,那就聊聊主流的东西。
	
一、web框架重新认知:
  既然都是框架,那肯定是都包含了这些模块和对应的功能!但是不同框架之间也是有些诧异,毕竟封装的方法不同。
	Django:
		- 路由(url路由系统)
		- 视图(视图函数)
		- 模板(模版页面)
		- 数据库  --->  ORM(类-表;对象-行; pymysql连接数据库)		
	Torando:
		- 路由
		- 视图
		- 模板
		- 数据库  --->  自由:pymysql;SqlAchemy
	Flask:
		- 路由
		- 视图
		- 模板(第三方的组件)
		- 数据库  --->  自由:pymysql;SqlAchemy

	数据库:操作数据库就两种选择:ORM框架或是原生sql,对于复杂的sql语句,ORM框架是无法实现的,还需要去写原生的sql语句去执行。
		所以说,对于数据库操作,这连个选择都必须要会。
		
二、django创建项目及目录设置操作:		
	
  有关django创建新项目的操作,已经在基础中提到过了,就不再重申了。由于我是使用pycharm,所以一些正经的操作都会以pycharm为准。
  1、创建新项目,创建satic文件,配置settings.py文件,这些操作都略过
  2、利用django创建app:
	(1)pycharm最底下一行是操作行,找到Terminal,点击进入命令行操作窗口。
	(2)执行命名:python manage.py startapp app01
	  - 此处说明一下:首先,创建项目的时候,有个python环境。看准是用什么版本的python创建的。
			其次,若电脑装了两个不同版本的python环境,先看自己的python自行程序是否重命名了。由于创建是利用python程序去执行,操作的时候一定要写对!
			最后:单环境下,直接执行 上述代码即可完成创建。由于我是双环境,执行创建代码为:python3 manage.py startapp app01	
			  - 再一点注意:可以创建多个app!一个django下可以有多个app(程序)存在!
				例如:python3 manage.py startapp app02
	(3)创建成功之后,会在当前项目中生成一个名为app***的文件夹,每个文件夹内会有多个py文件。先做如下解释:						
	  - app01
	  - migrations文件夹	用于存放数据库操作日志,不要轻易删除里边的数据
	  - __init__			模块执行前先自动加载的文件(学模块是有具体说明)
	  - admin				Django自带后台管理相关配置
	  - apps				保存当前app的一些配置信息
	  - modal   			写类,根据类创建数据库表
	  - test    			单元测试
	  - views   			业务处理
	  - app02
	    ……
  3、多个不同的app代表不同的业务,分管不同的模块和功能,这样就可以做到对同一框架的协同开发操作。
	
三、路由系统:
  url  -----> 函数
  静态路由:指的是写死的url,对应的某个视图函数的操作!要想看到相对应的模版,还需要手动在浏览器的地址栏中敲,前提是你知道这个url,否则就呵呵了!
		
    基础中写的全是静态路由: /login/ -> def login   动态路由:利用正则去匹配,同时兼顾seo权重的问题(爬虫爬取规则) - seo权重:是搜素引擎匹配的规则 - 注意点:get传参虽然可以实现功能,但是传值的参数会经常变动,同时这种方式的权重太低,及安全性不高!        #-------> get传参标志---> ? 为避免这种问题,尽量少用。 - URL 实质还是正则表达式,网页地址栏敲地址,实质上还是在与正则做匹配!   避免get传值:   1. 正则匹配urls页面,此时视图函数就需要再写一个形参,用于接收这个固定url后的值。 - 按位(顺序)传参   /add-user/(\w+)/ -> def add_user(request,a1) --- a1会接收(\w+)匹配传递的值   /add-user/(\w+)/(\w+)/ -> def add_user(request,a1,a2) --a1 是接收第一个,a2是接收第二个 - 此处一定要注意:匹配给视图函数传值;函数在接收的时候,是严格按照顺序接收的! - 指定传参,按照名称传递(不再按照顺序)   /add-user/(?P<a1>\w+)/ -> def add_user(request,a1)   /add-user/(?P<a1>\w+)/(?P<a2>\w+)/ -> def add_user(request,a1,a2) 注意:   在路由系统中:按顺序传参和指定名称传参不能混用,要不然视图函数无法完成匹配接收。   就是万能的(*args,**kwargs)也无法相对应接收!所以书写的时候一定要统一用法。   顺序传参由:args接收;按照指定名称传参由kwargs接收! PS:   终止符$:     - 如果页面没有终止符,那么网址之后就可以任意的写urls或是多个urls拼接在一起,这样也可以访问页面。
              但是我们不希望是有这种情况发生,毕竟不同的urls对应着不同的页面,所以urls之后写上终止符,只有写上固定的URL才能访问,其他的都不行。   ^edit$ 伪静态:在urls之后加上.html,伪装成固定的静态网站(特点:速度快!)权重最高!     url(r‘^edit/(\w+).html$‘, views.edit),   2. 路由分发:(应用于多个app开发) - 首先明确一点:多个app代表多个不同的业务。 - 用于解决多部门间协同开发同一框架上不同的业务功能模块的方法。             这种机制是让每个业务线操作写路由关系urls的时候互不干预,避免同时操作一个文件倒是url重复的问题! - 路由分发配置:   1、app文件中复制一份urls.py文件,py文件中用于书写当前app的对应关系   2、在项目主目录下mysite的urls.py文件中导入include     from django.conf.urls import include     配置:     url(r‘^app文件名/‘, include(‘app文件名.urls‘)), #注意:全是字符串格式     示例:   urls.py     url(r‘^app01/‘, include(‘app01.urls‘)),
                app01.urls.py     url(r‘^index.html$‘, views.index), PS:执行原理:   把路由匹配分成了两级,先在项目中的urls.py中匹配路由,路由urls指向对应的app文件,然后会在去app文件下的urls.py匹配相对应的url。   3、默认路由:(常用于访问出错,或是路由不匹配的情况下返回的固定信息) - 所有路由都没有匹配成功,再执行的路由关系,返回固定的提示或是固定的某个页面 示例:   from app01 import views   from django.shortcuts import HttpResponse   def default(request): return HttpResponse(‘哥们,走错了。。‘)       
           url(r‘^‘,default ),#返回固定的提示!   views.py def index(request):   return render(request,"index.html")   
              url(r‘^‘, views.index), #返回默认页面   4、命名:用于根据名字反向生成url (最大特点:可以通过名字反向生成url,用以应对 书写或是存储 复杂或是长的 路径) - 给urls.py文件中的对应关系,命名 name = "xxx" /add-user/(\d+)/ -> def add_user(request,a1) name=n1 根据名称可以反向生成URL   1. 在Python代码中 :通过request 和参数反生成url
              from django.urls import reverse def add_user(request,a1)   v = reverse(‘n1‘,     args=xxx, #对应顺序传参     kwargs={‘a1‘:1111} #对应按位传参     #为url传值,生成新的url,想获取什么url就获取什么url 两种方式二选一     )   print(v)   return render(request,"index.html") 浏览器地址栏:127.0.0.1:8000/index/123 后台拿到的v: index/1111   2. 在模版页面中,也可以根据名称反生成url(视图函数中不用传值,也不用返回值) - 没有参数的情况:   视图函数中: def login(request)   return reder(request,"login.html")   模版文件中: url(r‘^login/‘, views.login,name=‘m1‘)   {% url "m1" %} - 有参数,传值:   视图函数中:     def login(request,a1(*args))       return reder(request,"login.html")   模版文件中:     url(r‘^login/‘, views.login,name=‘m1‘) {% url "m1" 值 %} #按照顺序传值 单个值 {% url "m1" 值1 值2 %} #按照顺序传值 多值 #写值的时候,一定要注意空格! 五、ORM操作:关系对象映射操作数据库!   django的ORM没法直接连接数据库,需要利用pymysql第三方工具连接数据库,但是django默认使用MYSQLDB连接mysql,
  但是python3中没有MYSQLDB,所以就需要修改django默认连接mysql的方式!
  同时,django中默认使用sqlite(文件类型)操作数据库,也需要进行修改!     1、配置数据库:       # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 1、如下设置放置的与project同名的配置的 __init__.py文件中   import pymysql   pymysql.install_as_MySQLdb() 2、修改与project同名的配置文件settings.py中的DATABASES连接数据库的配置信息:   (1)把原来的信息注释掉!   (2)写入新的配置信息: DATABASES = {   ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘:‘s4day70‘, #数据库名称 ‘USER‘: ‘root‘, #账号 ‘PASSWORD‘: ‘‘, #密码 ‘HOST‘: ‘localhost‘, #IP ‘PORT‘: 3306, #端口号 ‘CHARSET‘:‘utf8‘, #字符编码 } } 3、注册app:   - 在settings.py文件中的 INSTALLED_APPS 配置信息,最后加上要操作的app文件名以完成注册操作。注意是字符串类型! INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, "app01", ]   - 有的会自动添加,不用大惊小怪,检查是否正确就行!

六、django ORM操作:

  1、字段及参数:

    http://www.cnblogs.com/zh605929205/articles/7103825.html

  2、models操作:

    http://www.cnblogs.com/zh605929205/articles/7103831.html

七、模版:

  http://www.cnblogs.com/zh605929205/articles/7103790.html

八、分页:

  http://www.cnblogs.com/zh605929205/articles/7103887.html

九、django的XSS与csrf机制:

  http://www.cnblogs.com/zh605929205/articles/7103796.html

十、django之session:

  http://www.cnblogs.com/zh605929205/articles/7103775.html

十一、中间件:

 

 

参考地址:

  http://www.cnblogs.com/wupeiqi/articles/5237704.html

  http://www.cnblogs.com/wupeiqi/articles/5246483.html

  http://www.cnblogs.com/wupeiqi/articles/6216618.html

python 全栈 web框架 Django进阶