唐代以前区域部分地区就已成陆。
唐天宝十年(751年)置华亭县,元二十八年(1291年)置上海县,现区南境属之;南宋嘉定十年(1217年)置嘉定县,清雍正二年(1724年)置宝山县,现区北境属之。
直至19世纪末,区域仍以西浜、李家浜、木渎港、蔡家浜、虬江等一线为界,南北分属上海县高昌乡、法华乡及宝山县真如乡、彭浦乡。鸦片战争以后,上海成为列强通商口岸。嗣后列强强占租界,且多次扩大区域,
至1899年,区境苏州河以南之大部分地区被列强辟为公共租界,开始了城市化进程,逐步成为上海市区的一部分。
1927年,上海特别市建立后,今区境之地,除公共租界外的其他地区分属闸北、彭浦、真如、蒲淞、法华等区。抗日战争期间,汪伪政府接管公共租界,重新划分政区,并在上海设立31个警区,苏州河以南之地被划为第十三警区,由普陀路警察局管理。
1945年,抗日战争胜利后,国民政府基本按旧时警区地段设区,苏州河以南之地域为第十三区。
1947年1月改称普陀区,区公所设在安远路玉佛禅寺内。
1949年5月上海解放,同月底成立普陀区接管委员会。
1950年6月28日,成立上海市普陀区人民政府,划入苏州河以北、中山北路以南地域。
1956年后又陆续划入真如、大场、西郊、宝山等区县部分地域。
1984年与1992年分别划入嘉定县的真如镇和长征、桃浦2个乡,至此普陀区的区境面积为55.53平方公里。
1959年正式定名为街道办事处,年内,区行政区划为7个街道,即宜川新村、普陀路、林家港、东新村、沙洪浜、胶州路、曹杨新村街道。
1963年5月区辖属街道调整为8个,建立中山北路街道。
1964年区辖街道调整为9个,建立朱家湾街道。
1982年2月,从宜川新村街道划出部分地区,建立甘泉新村街道,从曹杨新村街道划出部分地区建立曹安路街道,此时,区辖街道调整为11个。
1984年11月,嘉定县的真如镇划入区境,区行政区划为11个街道1个镇。
1987年7月,由于境域扩大,建立沪太新村街道。同年10月建立石泉新村街道,区行政区划为13个街道1个镇。
1991年9月,撤销普陀路、胶州路街道,建立长寿路街道;撤销甘泉新村、沪太新村街道,建立甘泉路街道;撤销朱家湾、石泉新村街道,建立石泉路街道,区行政区划为10个街道1个镇。
1992年7月,嘉定县的长征、桃浦2个乡划入区内,区行政区划为10个街道、1个镇、2个乡。
1993年3月,东新村街道更名为东新路街道。
1994年5月,沙洪浜街道更名为白玉路街道。同年12月,撤销长征、桃浦2个乡,建立长征镇和桃浦镇。区行政区划为10个街道3个镇。
1996年3月,新建真光路街道。同年3月,新建白丽路街道。区行政区划为12个街道3个镇。
1997年7月,撤销宜川新村、中山北路街道,建立宜川路街道。区行政区划为11个街道3个镇。
2000年5月,区行政区划进行了一次较大的调整。撤销曹安路、白玉路、东新路、真光路、白丽路等5个街道。
2014年12月,经市政府研究,同意设立万里街道办事处,驻地为富平路518号,长征镇行政区划作相应调整,驻地为万镇路180号;同意撤销真如镇建制,设立真如镇街道办事处,驻地为芝川路205号。